使 TreeNode 不可选择但仍然可用

Make TreeNode not selectable but still functional

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

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 将 expand/contract 分支,但节点本身不会突出显示。

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 和 child,但我看不到任何符合我要求的东西。

为树视图的 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 具有正确的 return 和参数类型,则不需要委托构造函数。

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);

使用节点的标签属性。 标签可以携带任何类型的物体。

// for unselectable
...
 node0.Tag = false;
...

// for selectable
...
node1.Tag = true;
...

在选择事件中你可以简单地:

if ((bool)node.Tag)
  { ... }