2010-01-26 97 views
0

我已經添加了複選框到我的樹形視圖中,並使用AfterSelect事件(也試過AfterChecked)。TreeView控件。複選框。並點擊

我的樹視圖是這樣

1國家
1.1 City1
1.2城2
1.3請分享幫助
2狀態
2.1 City1
2.2城2
2.3請分享幫助

我試圖運行一個事件,所以當點擊一個複選框時,標記將被添加到一個數組中,以備稍後處理。我也需要使用它,所以如果點擊一個狀態,它會選擇該葉下的所有城市。

treeSections.AfterSelect += node_AfterCheck; 

private void node_AfterCheck(object sender, TreeViewEventArgs e) 
{ 
    MessageBox.Show("testing"); 
} 

上面的代碼在樹視圖上工作,如果它沒有層次結構。但除非雙擊每個葉的文本/標籤,否則不要在州和城市的樹視圖上工作。

任何想法?

+0

.NET的哪個版本 - 我在VS2005中創建了一個快速示例,並且按預期工作 - AfterSelect和AfterCheck都適用於所有節點。 – Ruddy 2010-01-26 17:17:20

+0

這是你想要的東西嗎? - > http://stackoverflow.com/questions/1870455/how-to-get-treeview-behaviour-for-treenodes-that-when-you-check-one-it-checks-al(檢查子節點的代碼示例自動) – 2010-01-26 17:18:13

+0

@Ruddy它的.NET 3.0 它工作正常,樹上的單個樹葉列表。但是,如果父母有孩子(可能不是正確的術語),並且您選擇了孩子或父母,則不起作用。 – 2010-01-26 17:22:34

回答

4

我建議使用TreeView.NodeMouseClick和TreeView.KeyUp事件的組合...點擊事件將通過事件參數爲您提供點擊節點,並且您可以使用當前選定節點的關鍵點。按照下面的例子...

//This is basic - you may need to modify logically to fit your needs 
void ManageTreeChecked(TreeNode node) 
{ 
    foreach(TreeNode n in node.Nodes) 
    { 
     n.Checked = node.Checked; 
    } 
} 

private void convTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    ManageTreeChecked(e.Node); 
} 
private void convTreeView_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Space) 
    { 
     ManageTreeChecked(convTreeView.SelectedNode); 
    } 
} 

使用給每個你現在可以通過該節點的節點集合週期和修改進行檢查事件節點/選中給出的節點的檢查狀態的狀態你採取行動。

當所有的子節點未被選中時,你甚至可以花哨的取消選中一個父節點。如果你需要一個三態treenode(全選,一些選中和無選中),那麼你必須創建它或找到一個已經創建的。

享受,祝你好運。

1

一些代碼爲你考慮:

這裏未考慮:

  1. 什麼關於哪些檢查時,選擇的節點,當一個孩子節點選擇強制父節點被選擇(因爲所有其他子節點都被選中)。

  2. 可能與其他情況有關的選擇不考慮在這裏。

假設:

  1. 你是在一個單節點選擇模式

  2. 深度只有兩個級別,如OP的樣本(「重型」遞歸不是一個TreeView需要)

  3. 一切只用鼠標完成:額外的操作,如鍵盤按鍵不需要。

  4. 如果所有的子節點進行檢查,父節點是自動選中的

  5. 取消選中所有子節點將取消選中的父節點

  6. 選中或取消選中父節點將設置所有子節點相同的檢查狀態

...

// the current Node in AfterSelect 
    private TreeNode currentNode; 

    // flag to prevent recursion 
    private bool dontRecurse; 

    // boolean used in testing if all child nodes are checked 
    private bool isChecked; 

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
     // prevent recursion here 
     if (dontRecurse) return; 

     // set the currentNode 
     currentNode = e.Node; 

     // for debugging 
     //Console.WriteLine("after check node = " + currentNode.Text); 

     // select or unselect the current node depending on checkstate 
     if (currentNode.Checked) 
     { 
      treeView1.SelectedNode = currentNode; 
     } 
     else 
     { 
      treeView1.SelectedNode = null; 
     } 

     if(currentNode.Nodes.Count > 0) 
     { 
      // node with children : make the child nodes 
      // checked state match the parents 
      foreach (TreeNode theNode in currentNode.Nodes) 
      { 
       theNode.Checked = currentNode.Checked; 
      } 
     } 
     else 
     { 
      // assume a child node is selected here 
      // i.e., we assume no root level nodes without children 

      if (!currentNode.Checked) 
      { 
       // the child node is unchecked : uncheck the parent node 
       dontRecurse = true; 

        currentNode.Parent.Checked = false; 

       dontRecurse = false; 
      } 
      else 
      { 
       // the child node is checked : check the parent node 
       // if all other siblings are checked 
       // check the parent node 
       dontRecurse = true; 

        isChecked = true; 

        foreach(TreeNode theNode in currentNode.Parent.Nodes) 
        { 
         if(theNode != currentNode) 
         { 
          if (!theNode.Checked) isChecked = false; 
         } 
        } 

        if (isChecked) currentNode.Parent.Checked = true; 

       dontRecurse = false; 
      } 

     } 
    }