2013-03-03 75 views
1

我在我的表單中啓用了複選框。我需要添加任何檢查到列表,所以我可以寫出列表。如果我檢查任何父節點(或最高級別的節點),它包括它們。如果我選擇任何父節點,它也會選擇其子節點(這是故意的),並顯示這些節點。但是,如果我只檢查任何子節點,它不會將它們添加到我的列表中。爲什麼沒有選擇父節點時我的子節點沒有被檢測到?

//check to see if there are any nodes checked 
      bool nodeHasCheck = false; 
      foreach (TreeNode n in nodes) 
      { 
       if (n.Checked) 
       { 
        nodeHasCheck = true; 
        break; 
       } 

       GetExtendedFeatures(n.Nodes); 
      } 

      //only return stuff if something's checked 
      if (nodeHasCheck == true) 
      { 

       foreach (TreeNode n in nodes) 
       { 
        if (n.Checked) 
        { 
         //n.BackColor = Color.Black; 
         nodeList.Add(n.Text); 
        } 

        GetExtendedFeatures(n.Nodes); 
       } 

它還看來,如果我選擇2個父節點,發生(認爲這是正確的術語)的遞歸導致它找到第一個檢查點,然後重新開始,並補充說,同樣的檢查節點第二次擊中第二組節點之前。

我提供了我的節點測試,希望它足以確定爲什麼它沒有檢測到未選擇父節點時選擇的子節點。

更新 - 13年3月18日 我按一下按鈕代碼:

private void btnGenerate_Click(object sender, EventArgs e) 
     { 
      ScanNodes(treeView1.Nodes[0]);     
     } 
private void ScanNodes(TreeNode parent) 
     { 
      foreach (TreeNode node in parent.Nodes) 
      { 
       if (node.Checked) 
       { 
        nodeList.Add(node.Text.ToString()); 
       } 
       if (node.Nodes.Count > 0) 
       { 
        ScanNodes(node); 
       } 
      } 


       var message = string.Join(Environment.NewLine, nodeList); 
       message = message.Replace(Environment.NewLine, ", "); 



       MessageBox.Show(message); 
       nodeList.Clear(); 

     } 
+0

我沒有看到遞歸這裏,除非GetExtendedFeatures其實是你展示方法的代碼。對於您當前的代碼,它只能通過檢查父母的子節點循環。你必須遍歷所有節點,看看它們是否被選中,然後添加到列表中。 – echavez 2013-03-03 20:13:34

回答

3

要獲取所有選擇的節點列表中的一個TreeView,你可以使用以下命令:

Supose名單是命名爲nodeList

//We First declare a recursive method to loop through all nodes, 
//we need to pass a root node to start 
    private void ScanNodes(TreeNode parent) 
      { 
       foreach (TreeNode node in parent.Nodes) 
       { 
        if (node.Checked) 
        { 
         nodeList.Add(node.Text); 
        } 
        if (node.Nodes.Count > 0) 
        { 
         ScanNodes(node); 
        } 
       } 
      } 

那個設定你只需要調用ScanNodes方法,並通過您的TreeView的根節點:

ScanNodes(treeView1.Nodes[0]); 

問候,

+0

我添加了你的方法,然後將這個調用添加到我的運行按鈕的ScanNodes方法中,然後添加一個消息框來顯示已選擇的節點,但它仍然是空的。我的檢查節點沒有觸發你的支票,不幸的是我不明白爲什麼。 – 2013-03-15 21:37:38

+0

ScanNodes的代碼沒有返回值,只是將選中的節點的文本屬性保存到列表中,您可以發佈您的button_click代碼嗎? – echavez 2013-03-16 19:59:59

+0

請參閱修訂版。 – 2013-03-18 16:25:39

相關問題