使 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)
{ ... }
我在设计器代码中初始化组件:
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)
{ ... }