【问题标题】:store grandchild nodes text from TreeView on a List in C# (Winforms)将来自 TreeView 的孙节点文本存储在 C# 中的列表中(Winforms)
【发布时间】:2013-10-30 01:26:49
【问题描述】:

假设我有一个像这样的树视图:

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

这只会捕获前两个孙子(3 和 4),但不会捕获 6 和 7。有没有办法在不考虑父母的情况下迭代树视图的一个级别??

【问题讨论】:

  • 那是因为您总是使用Nodes[0].Nodes[0] 将其称为第一个孙子。第二个Nodes[0] 调用应该是动态的。
  • 你是对的。用来自 nodes[0].nodes 的计数将 foreach 封装在一个 for 循环中就可以了。

标签: c# winforms treeview


【解决方案1】:

你可以使用 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);
}

这是一个通用的解决方案:

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

一个完整的例子:

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

【讨论】:

  • 这个表达式:nodes.SelectMany(n => n.Nodes) 给出了 ArgumentNullException。
  • @shingonati0n 我更正了答案。编辑您的代码并重试。
  • @shingonati0n 再次更正,对不起!
【解决方案2】:

首先,感谢@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));
                }
            }

这也可以获得关卡的节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多