将TreeView中的孙子节点文本存储在C#(Winforms)中的列表中

将TreeView中的孙子节点文本存储在C#(Winforms)中的列表中,c#,winforms,treeview,C#,Winforms,Treeview,假设我有一个树状视图,就像这样: 1 |_2 |_3 |_4 |_5 |_6 |_7 我需要从这棵树的第2层的所有节点捕获文本 如果我这样做: List<string> list = new List<string>(); foreach(TreeNode node in treeView1.Nodes[0].Nodes[0].Nodes.Count) { list.Add(node.Text); } List List=新列表(); f

假设我有一个树状视图,就像这样:

1
|_2
  |_3
  |_4
|_5
  |_6
  |_7
我需要从这棵树的第2层的所有节点捕获文本

如果我这样做:

List<string> list = new List<string>();
foreach(TreeNode node in treeView1.Nodes[0].Nodes[0].Nodes.Count)
{
       list.Add(node.Text);
}
List List=新列表();
foreach(TreeView中的TreeNode节点1.Nodes[0]。Nodes[0]。Nodes.Count)
{
list.Add(node.Text);
}
这只会捕获前两个孙子(3和4),但6和7不会被捕获。是否有任何方法可以在不考虑父级的情况下遍历树视图的某个级别???

您可以使用Linq:

var nodes = treeView1.Nodes
               .Cast<TreeNode>()
               .SelectMany(n => n.Nodes.Cast<TreeNode>())
               .SelectMany(n => n.Nodes.Cast<TreeNode>());

foreach(TreeNode node in nodes)
{
       list.Add(node.Text);
}
var nodes=treeView1.nodes
.Cast()
.SelectMany(n=>n.Nodes.Cast())
.SelectMany(n=>n.Nodes.Cast());
foreach(节点中的树节点)
{
list.Add(node.Text);
}
以下是一个通用解决方案:

public static IEnumerable<TreeNode> GetNodesByDepth(TreeView treeView, int depth)
{
    var nodes = treeView.Nodes.Cast<TreeNode>();
    for (int i=0; i < depth; i++)
        nodes = nodes.SelectMany(n => n.Nodes.Cast<TreeNode>());
    return nodes;
}
公共静态IEnumerable GetNodesByDepth(TreeView TreeView,int-depth)
{
var nodes=treeView.nodes.Cast();
for(int i=0;in.nodes.Cast());
返回节点;
}
一个完整的例子:

public class Program
{
    public static IEnumerable<TreeNode> GetNodesByDepth(TreeView treeView, int depth)
    {
        var nodes = treeView.Nodes.Cast<TreeNode>();
        for (int i = 0; i < depth; i++)
            nodes = nodes.SelectMany(n => n.Nodes.Cast<TreeNode>());
        return nodes;
    }
    static void Main(string[] args)
    {
        TreeView treeView = new TreeView();

        TreeNode node1 = new TreeNode("1");
        TreeNode node2 = new TreeNode("2");
        TreeNode node3 = new TreeNode("3");
        TreeNode node4 = new TreeNode("4");
        TreeNode node5 = new TreeNode("5");
        TreeNode node6 = new TreeNode("6");
        TreeNode node7 = new TreeNode("7");

        treeView.Nodes.Add(node1);
        node1.Nodes.Add(node2);
        node1.Nodes.Add(node5);
        node2.Nodes.Add(node3);
        node2.Nodes.Add(node4);
        node5.Nodes.Add(node6);
        node5.Nodes.Add(node7);

        Console.WriteLine("Method 1:");
        var nodes = treeView.Nodes
           .Cast<TreeNode>()
           .SelectMany(n => n.Nodes.Cast<TreeNode>())
           .SelectMany(n => n.Nodes.Cast<TreeNode>());

        foreach (TreeNode node in nodes)
        {
            Console.WriteLine(node.Text);
        }

        Console.WriteLine();
        Console.WriteLine("----------------");
        Console.WriteLine("Method 2:");
        nodes = GetNodesByDepth(treeView, 2);

        foreach (TreeNode node in nodes)
        {
            Console.WriteLine(node.Text);
        }
    }
}
公共类程序
{
公共静态IEnumerable GetNodesByDepth(TreeView TreeView,int-depth)
{
var nodes=treeView.nodes.Cast();
for(int i=0;in.nodes.Cast());
返回节点;
}
静态void Main(字符串[]参数)
{
TreeView TreeView=新的TreeView();
TreeNode节点1=新的TreeNode(“1”);
TreeNode节点2=新的TreeNode(“2”);
TreeNode节点3=新的TreeNode(“3”);
TreeNode节点4=新的TreeNode(“4”);
TreeNode节点5=新的TreeNode(“5”);
TreeNode节点6=新的TreeNode(“6”);
TreeNode节点7=新的TreeNode(“7”);
treeView.Nodes.Add(node1);
node1.Nodes.Add(node2);
node1.Nodes.Add(node5);
node2.Nodes.Add(node3);
node2.Nodes.Add(node4);
node5.Nodes.Add(node6);
node5.Nodes.Add(node7);
Console.WriteLine(“方法1:”);
var nodes=treeView.nodes
.Cast()
.SelectMany(n=>n.Nodes.Cast())
.SelectMany(n=>n.Nodes.Cast());
foreach(节点中的树节点)
{
Console.WriteLine(node.Text);
}
Console.WriteLine();
Console.WriteLine(“------------------------------”);
Console.WriteLine(“方法2:”);
nodes=GetNodesByDepth(treeView,2);
foreach(节点中的树节点)
{
Console.WriteLine(node.Text);
}
}
}

首先,感谢@Ahmed KRAIEM,他的方法是有效的,尽管我是根据@Andrei V.的提示得出的

我最终使用的解决方案是:

for (int i = 0; i < trv.Nodes[0].Nodes.Count; i++)
            {
                foreach (TreeNode nodo in trv.Nodes[0].Nodes[i].Nodes)
                {
                    ordenes.Add(Convert.ToInt32(nodo.Text));
                }
            }
for(int i=0;i

这也会获取某个级别的节点。

这是因为您总是使用
节点[0]调用它的第一个孙子。节点[0]
。第二个
节点[0]
调用应该是动态的。您是对的。使用节点[0]的计数将foreach封装在for循环中。节点完成了此工作。此表达式:nodes.SelectMany(n=>n.nodes)给出ArgumentNullException。@shingonati0n我更正了答案。编辑您的代码,然后重试。@shingonati0n再次更正,抱歉!