使TreeNode不可选但仍然可用

时间:2017-04-25 14:47:34

标签: c# winforms treenode

我在设计器代码中初始化组件:

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中,我可以区分父母和孩子,但我看不到任何可以做我想做的事。

Parent node highlighted

2 个答案:

答案 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)
  { ... }