2017-04-25 65 views
0

我初始化在设计代码的组件:设计师外制作树节点不可选的,但仍然功能

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

+0

不要修改设计代码! – TaW

+0

难道你不能只选择事件中的子节点吗?你打算如何选择带键盘的节点? – stuartd

+0

@TaW:在我的示例中,您看到设计器代码在哪里修改? –

回答

3

添加TreeView的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

这是将句柄添加到控件的行:'this.treeViewCategory.BeforeSelect + = new System.Windows.Forms.TreeViewCancelEventHandler(this.treeViewCategory_BeforeSelect);' 这是有效的,并具有突出显示节点的不幸效果(和然后恢复到之前选择的节点)。多么可怕的设计。 –

+1

@AlLelopath我同意。选择回复位很难看。 “之前”应该表示之前。 –