2012-04-12 53 views
3

這一個很難解釋,所以我只是告訴你我想實現什麼以及我如何做,所以也許有人會對我做錯的想法有所瞭解。C#TreeView Collapse/Expand on parent select

在我的winForm我有一個TreeView控件,我填充。所有的父母都有孩子(他們中的任何一個),但沒有孩子有自己的孩子。例如:

- Parent 1 
     Child 1 
     Child 2 
     Child 3 
- Parent 2 
     Child 4 

我想要的行爲如下:

  1. ,當用戶點擊一個孩子得到它的選擇(默認情況下完成)
  2. 當用戶點擊一個家長,應該要麼摺疊或展開但不改變任何選擇

點1是沒有問題的,因爲它是TreeView的默認行爲,點2卻是另一回事。

這是我迄今所做的:

爲了防止選擇我添加BeforeSelect事件處理程序的父,並把它下面的代碼:

if (e.Node.Parent == null) 
    e.Cancel = true; 

這做這項工作完美。所以,現在我取消了我想要展開或摺疊的父項的選擇。因此,我改變上面的代碼:

if (e.Node.Parent == null) 
{ 
    if (e.Node.IsExpanded) 
    { 
     e.Node.Collapse(); 
    } 
    else 
    { 
     e.Node.Expand(); 
    } 
    e.Cancel = true; 
} 

這有些工作 - 除了不像點擊+符號,調用擴展()或摺疊()使得父節點被選擇,忽略e.Cancel =真;線。

我試着在調用Collapse()或Expand()之前獲取SelectedNode,然後將其設置回去 - 它可以工作,但是當我這樣做時它會再次展開父級以進行選擇。

某些+標誌確實是我想要發生的事情,當我點擊父母 - 我似乎無法讓它工作。

想法?

在此先感謝

回答

1

試試這個:

private bool allowExpandCollapse = false; 

    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
    { 
     e.Cancel = !allowExpandCollapse; 
    } 

    private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) 
    { 
     e.Cancel = !allowExpandCollapse; 
    } 

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
    { 
     if (e.Node.Parent == null) 
     { 
      e.Cancel = true; 
     } 
    } 

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Node.Parent == null) 
     { 
      allowExpandCollapse = true; 
      if (e.Node.IsExpanded) 
      { 
       TreeNode selectedNode = treeView1.SelectedNode; 
       e.Node.Collapse(); 
       allowExpandCollapse = false; 
       treeView1.SelectedNode = selectedNode; 
      } 
      else 
      { 
       e.Node.Expand(); 
       allowExpandCollapse = false; 
      } 
     } 
    } 
+0

方式復活吶老話題 - 洛爾 - 因爲我已經移出這個項目,但你的答案似乎是固體,所以我將它送給你 – 537mfb 2013-07-29 11:10:44

+0

@你能解釋一下這裏發生了什麼嗎?我不完全確定。我的問題是,我的SelectedNodeChanged不會觸發,如果我點擊兩次相同的節點(一個用於展開,一個用於摺疊) – Ortund 2013-09-16 10:39:54

+0

我沒有在TreeView中找到SelectedNodeChanged事件。你的意思是AfterSelect?實際上,當您單擊某個根(可展開)節點時,此代碼不會更改選擇。請注意,樹的結構應該遵循以下問題的陳述:「所有父母都有孩子(任何數量的孩子),但沒有孩子有自己的孩子」 – chiper 2013-10-24 16:02:53