获取TreeView控件中所有树节点(在所有级别中)的列表

Mah*_*hat 9 c# asp.net treeview

如何获取TreeView控件中所有树节点(在所有级别中)的列表?

mod*_*diX 23

您可以使用两种递归扩展方法.你可以打电话myTreeView.GetAllNodes()myTreeNode.GetAllNodes():

public static List<TreeNode> GetAllNodes(this TreeView _self)
{
    List<TreeNode> result = new List<TreeNode>();
    foreach (TreeNode child in _self.Nodes)
    {
        result.AddRange(child.GetAllNodes());
    }
    return result;
}

public static List<TreeNode> GetAllNodes(this TreeNode _self)
{
    List<TreeNode> result = new List<TreeNode>();
    result.Add(_self);
    foreach (TreeNode child in _self.Nodes)
    {
        result.AddRange(child.GetAllNodes());
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 为我运行通过 `_self.Nodes` 更改 `_self.ChildNodes`。请记住将这两个方法写入一个新的静态类:`public static class TreeViewExtensions`。 (2认同)

Kru*_*lur 17

假设您有一个具有一个根节点的树,以下代码将始终将树节点循环到最深处,然后返回一个级别,依此类推.它将打印每个节点的文本.(从头顶未经测试)

TreeNode oMainNode = oYourTreeView.Nodes[0];
PrintNodesRecursive(oMainNode);

public void PrintNodesRecursive(TreeNode oParentNode)
{
  Console.WriteLine(oParentNode.Text);

  // Start recursion on all subnodes.
  foreach(TreeNode oSubNode in oParentNode.Nodes)
  {
    PrintNodesRecursive(oSubNode);
  }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*rin 9

懒惰的LINQ方法,以防万一你正在寻找这样的东西:

private void EnumerateAllNodes()
{
    TreeView myTree = ...;

    var allNodes = myTree.Nodes
        .Cast<TreeNode>()
        .SelectMany(GetNodeBranch);

    foreach (var treeNode in allNodes)
    {
        // Do something
    }
}

private IEnumerable<TreeNode> GetNodeBranch(TreeNode node)
{
    yield return node;

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


dze*_*ras 6

更新Krumelur的答案(用此替换他/她的解决方案的2个第一行):

foreach ( var node in oYourTreeView.Nodes )
{
    PrintNodesRecursive( node );
}
Run Code Online (Sandbox Code Playgroud)