2013-03-03 74 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

相关问题