我在设计器代码中初始化组件:
private void InitializeComponent(){
this.treeViewCategory.Name = "treeViewCategory";
this.treeViewCategory.Size = new System.Drawing.Size(287, 303);
this.treeViewCategory.TabIndex = 14;
this.treeViewCategory.DoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewCategory_TreeNodeMouseClickEventHandler);
}
在设计师之外,我修改它:
this.treeViewCategory.Update();
TreeNode node = this.treeViewCategory.Nodes.Add("Node 1");
node.Name = "Node 1";
node.Nodes.Add("Node 1-Child");
node = this.treeViewCategory.Nodes.Add("Node 2");
node.Name = "Node 2";
node.Nodes.Add("Node 2-Child 1");
node.Nodes.Add("Node 2-Child 2");
this.treeViewCategory.ExpandAll();
this.treeViewCategory.EndUpdate();
我希望节点1和节点2正常运行但不可选。因此,单击节点1或节点2将扩展/收缩分支,但节点本身不会突出显示。
private void treeViewCategory_TreeNodeMouseClickEventHandler(object sender, TreeNodeMouseClickEventArgs eventArgs)
{
TreeView treeView = (TreeView)sender;
TreeNode treeNode = eventArgs.Node; // parent or child
String nodeText = treeNode.Text;
// if parent node
if (nodeText.Contains("Node 1") || nodeText.Contains("Node 2")) {
// don't select the node
}
else { // child
}
}
在treeViewCategory_TreeNodeMouseClickEventHandler
中,我可以区分父母和孩子,但我看不到任何可以做我想做的事。
答案 0 :(得分:3)
为树视图的BeforeSelect
事件添加处理程序,并在那里取消选择。
// Add unselectable nodes to this collection when you create them
private List<TreeNode> _unselectableNodes = new List<TreeNode>();
private void treeViewCategory_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (_unselectableNodes.Contains(e.Node))
{
e.Cancel = true;
}
}
不幸的是,正如评论中所述,这并不是阻止选择,而是在用户释放鼠标按钮时将其还原。我的偏好是BeforeSelect
事件在选择发生之前完全发生。但这可能是一个原因。
处理程序设置,如果您没有通过表单构建器执行此操作。这应该在您的表单的构造函数中。如果treeViewCategory_BeforeSelect
具有正确的返回和参数类型,则无需委托构造函数。
this.treeViewCategory.BeforeSelect += treeViewCategory_BeforeSelect;
节点创建:
TreeNode node = this.treeViewCategory.Nodes.Add("Node 1");
node.Name = "Node 1";
_unselectableNodes.Add(node);
node.Nodes.Add("Node 1-Child");
node = this.treeViewCategory.Nodes.Add("Node 2");
node.Name = "Node 2";
_unselectableNodes.Add(node);
答案 1 :(得分:1)
使用节点的Tag属性。 标签可以携带任何类型的对象。
// for unselectable
...
node0.Tag = false;
...
// for selectable
...
node1.Tag = true;
...
在选择事件中,您只需:
if ((bool)node.Tag)
{ ... }