【问题标题】:How to Iterate through all nodes of a treeView Control. C#如何遍历 treeView 控件的所有节点。 C#
【发布时间】:2013-10-30 18:44:01
【问题描述】:

我正在选择 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
            //...
            //...
            //...
       }
    }
    //...
}

有什么想法吗?

谢谢

【问题讨论】:

  • 啊……对不起。我的错。
  • 等等...你只需要((TreeView)c).Nodes?
  • 我在@Sriram Sakthivel 看到了。问题是:我做不到:TreeNodeCollection myNodes = c.Nodes;//是错误
  • @Darren Kopp OMFG!这很容易。 非常感谢!

标签: c# loops treeview nodes


【解决方案1】:

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

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
 }

【讨论】:

  • 嘿@Darren Kopp 非常感谢! 你做主!
【解决方案2】:

这很简单:

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

然后调用它:

TraverseTree(MyTreeView.Nodes);

【讨论】:

  • 非常感谢@Jim Mischel
  • 这个答案在asp.net中对我有用。谢谢
【解决方案3】:

您的错误是c 实际上是Control 类型的变量,它没有Nodes 成员。您需要将其转换为 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;
        ...
}

【讨论】:

  • 非常感谢! @elgonzo
【解决方案4】:

我更喜欢简单,这是我的简单解决方案:

    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, "");

与此处发布的一些示例不同,我实际上对此进行了测试(哎呀!我能听到他们说)。

【讨论】:

    【解决方案5】:

    试试这个

        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 == "")
                    {
    
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案6】:

      在 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() ) ...
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多