如何遍历treeView控件的所有节点.C#

Jea*_*ean 1 c# treeview loops nodes

我正在选择我所拥有的所有控件 form

如果是控件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
            //...
            //...
            //...
       }
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

谢谢

Dar*_*opp 24

你需要使用递归.像这样的方法就足够了

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

        foreach (var child in Collect(node.Nodes))
            yield return child;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的方法中你可以做到

 foreach (var node in Collect(tree.Nodes))
 {
     // you will see every child node here
 }
Run Code Online (Sandbox Code Playgroud)


Jim*_*hel 7

这很简单:

void TraverseTree(TreeNodeCollection nodes)
{
    foreach (var child in nodes)
    {
        DoSomethingWithNode(child);
        TraverseTree(child.Nodes);
    }
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

TraverseTree(MyTreeView.Nodes);
Run Code Online (Sandbox Code Playgroud)


小智 2

您的错误是,它c实际上是类型的变量Control,它没有Nodes成员。您将需要它来将其转换为TreeView类型。

您可以采用以下两种方法之一:

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

或者

TreeView tv = c as TreeView;
if (tv != null)
{
        TreeNodeCollection myNodes = tv.Nodes;
        ...
}
Run Code Online (Sandbox Code Playgroud)