访问TreeView Control中的所有节点

use*_*558 8 c# treeview winforms

我有一组TreeView控制节点和子节点.例如:

ROOT有A,B,C.

A具有a1,a2,a3,然后a1,a2也包含一些节点,如x1,x2,x3等.像这样很多子节点都在那里.我知道可以使用带有for循环的循环.

我只想TreeView使用一个或两个for循环访问控制中的所有节点.

是否有任何算法或有其他方法吗?

还有一个问题:是否可以使用任何库函数在对象或字符串中创建树节点的路径?例如:

string S = TreeView1.Nodes[i].Nodes[j].Nodes
Run Code Online (Sandbox Code Playgroud)

tan*_*ius 9

不要使用嵌套循环,但要使用递归解决方案,例如:

void ListNodes( TreeNode node )
{
  foreach( var subnode in node.Nodes )
  {
    ListNodes( subnode );
  }
  // Print out node
}
Run Code Online (Sandbox Code Playgroud)

为您的根节点调用此函数.

如有其他问题,请查看FullPath酒店.


adr*_*nks 6

您可以使用递归函数遍历整个树:

private void Traverse(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        Console.WriteLine("{0} -> {1}", node.Name, node.FullPath);
        Traverse(node.Nodes);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下方法调用:

Traverse(treeView.Nodes);
Run Code Online (Sandbox Code Playgroud)

并且它将首先遍历整个树的深度(即,在移动到下一个兄弟之前尽可能深地下行).传入Nodes集合意味着此代码将处理具有多个根节点的树.

上面的示例代码将打印出节点的名称以及树中该节点的完整路径.


noc*_*yto 5

我不是递归的最大粉丝,但似乎你必须使用它.我看到一个聪明的例子在线混合递归和迭代器.

    private int GetLevels(TreeNodeCollection treeNodes)
    {
        int level = 0;
        foreach (TreeNode node in TreeTopDown(treeNodes))
        {
            int i = node.Level;
            if (i > level) level = i;
        }
        return level;
    }

    //TopDown Iterator 
    private IEnumerable<TreeNode> TreeTopDown(TreeNodeCollection treeNodes)
    {
        foreach (TreeNode node in treeNodes)
        {
            yield return node;
            foreach (TreeNode subNode in TreeTopDown(node.Nodes)) yield return subNode;               
        }
    }

    //BottomUp Iterator
    private IEnumerable<TreeNode> TreeBottomUp(TreeNodeCollection treeNodes)
    {
        foreach (TreeNode node in treeNodes)
        {
            foreach (TreeNode subNode in TreeBottomUp(node.Nodes)) yield return subNode;
            yield return node;
        }
    }
Run Code Online (Sandbox Code Playgroud)