2013-10-30 51 views
1

我选择我在所有控件form如何遍历treeView控件的所有节点。 C#

如果控件Treeviews,我会重复他们

我需要的东西,像所有的节点: (它是我的代码)

foreach (Control c in PanelSM.Controls) 
{ 
    if (c is TreeView) 
    {  
     TreeNodeCollection myNodes = c.Nodes;//<<<<< Here is a mistake 
     foreach (TreeNode n in myNodes) 
     { 
      String text = rm.GetString(n.Name); 
      //And more things 
      //... 
      //... 
      //... 
     } 
    } 
    //... 
} 

任何想法?

谢谢

+1

Ahhhh ..对不起。我的错。 – David

+1

等待......就是你需要的一切'((TreeView)c).Nodes'? –

+0

[这有帮助吗?](http://msdn.microsoft.com/en-us/library/wwc698z7%28v=vs.90%29.aspx) –

回答

2

你的错误就在于c实际上是Control类型的变量,它不具有节点成员。您需要将其转换为TreeView类型。

你可以做这两种方法之一:

if (c is TreeView) 
{ 
    TreeNodeCollection myNodes = ((TreeView) c).Nodes; // <<--- Note the cast 
    ... 
} 

TreeView tv = c as TreeView; 
if (tv != null) 
{ 
     TreeNodeCollection myNodes = tv.Nodes; 
     ... 
} 
+0

非常感谢你! @elgonzo – Jean

16

您需要使用递归。像这样的方法应该足够

IEnumerable<TreeNode> Collect(TreeNodeCollection nodes) 
{ 
    foreach(TreeNode node in nodes) 
    { 
     yield return node; 

     foreach (var child in Collect(node.Nodes)) 
      yield return child; 
    } 
} 

然后在你的方法,你可以做

foreach (var node in Collect(tree.Nodes)) 
{ 
    // you will see every child node here 
} 
+0

嘿@Darren Kopp非常感谢你! **你统治!** – Jean

6

这是很容易:

void TraverseTree(TreeNodeCollection nodes) 
{ 
    foreach (var child in nodes) 
    { 
     DoSomethingWithNode(child); 
     TraverseTree(child.Nodes); 
    } 
} 

里调用:

TraverseTree(MyTreeView.Nodes); 
+0

非常感谢你@Jim Mischel – Jean

0

尝试达伦的伟大回答此之上

foreach (TreeNode t in tvMenu.Nodes) 
    { 
     for (int iParent = 0; iParent < t.ChildNodes.Count; iParent++) 
     { 
      for (int iChild = 0; iChild < t.ChildNodes[iParent].ChildNodes.Count; iChild++) 
      { 
       if (t.ChildNodes[iParent].ChildNodes[iChild].Text == "") 
       { 

       } 
      } 
     } 
    } 
0

大厦,你可以结合递归和类扩展

申报命名空间的地方:

public static class MyExtensions 
{ 
    public static IEnumerable<TreeNode> All(this TreeNodeCollection nodes) 
    { 
     foreach(TreeNode n in nodes) 
     { 
      yield return n; 
      foreach(TreeNode child in n.Nodes.All()) 
       yield return child; 
     } 
    } 
} 

注意“这个”方法的第一个参数之前。

然后你就可以在所有的树视图使用这种新方法为:

foreach(TreeNode n in myTreeview.Nodes.All()) ... 
+0

你可以使任何方法成为一种扩展方法。这并不是真的在答案中添加任何东西,只是将它变成扩展方法。最重要的是[你并没有选择一个特别好的实现来遍历树](http://stackoverflow.com/a/10253591/1159478)。 – Servy

1

我更喜欢简单,这里是我的简单的解决办法:

protected void TraverseNodes(TreeNodeCollection nodes, string action, int maxDepth = 2) 
    { 
     foreach (TreeNode node in nodes) 
     { 
      if (node.ChildNodes.Count > 0 && node.Depth < maxDepth) 
       TraverseNodes(node.ChildNodes, action, maxDepth); 

      //do something!!! 
      var x = node.Text; 
      node.Checked = !node.Checked; 
     } 
    } 

我决定包括“最大深度”作为奖励,很享受。

叫它如下:

   TraverseNodes(this.Activities.Nodes, ""); 

不像一些张贴在这里的例子,我实际测试过这个(哎哟我能听到他们说的!)。