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

时间:2013-10-30 18:44:02

标签: c# loops treeview 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
            //...
            //...
            //...
       }
    }
    //...
}

有什么想法吗?

谢谢

6 个答案:

答案 0 :(得分:20)

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

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
 }

答案 1 :(得分:6)

这很简单:

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

并将其命名为:

TraverseTree(MyTreeView.Nodes);

答案 2 :(得分: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;
        ...
}

答案 3 :(得分: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;
        }
    }

我决定加入一个&#34;最大深度&#34;作为奖励,所以尽情享受。

请按以下方式调用:

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

与此处发布的一些示例不同,我实际测试了这个(哎哟!我可以听到他们说)。

答案 4 :(得分: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 == "")
                {

                }
            }
        }
    }

答案 5 :(得分:0)

在Darren的最佳答案之上,你可以结合递归和类扩展

在命名空间中的某处声明:

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;
        }
    }
}

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

然后,您可以在所有树视图中使用此新方法:

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