2017-04-25 73 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我同意。選擇回覆位很難看。 「之前」應該表示之前。 –