获取树视图中所有已检查节点及其子节点的列表

Jos*_*sef 8 c# treeview winforms

我有一个树视图列表复选框,列表包含节点,子节点,在某些情况下包含子节点的子节点.当用户检查一些项目时,我想获得所选项目的列表.

这就是为什么我只获得主节点的选项:

 foreach (System.Windows.Forms.TreeNode aNode in tvSastavnica.Nodes)
        {
            if (aNode.Checked == true)
            {
                Console.WriteLine(aNode.Text);
            }
        }
Run Code Online (Sandbox Code Playgroud)

如何遍历整个树视图并获取子节点中的选中项?

Lar*_*rry 14

如果你喜欢LINQ,你可以创建一个遍历整个树视图的扩展方法:

internal static IEnumerable<TreeNode> Descendants(this TreeNodeCollection c)
{
    foreach (var node in c.OfType<TreeNode>())
    {
        yield return node;

        foreach (var child in node.Nodes.Descendants())
        {
            yield return child;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用LINQ执行所需的每个操作.在您的情况下,获取所选节点的列表很容易:

var selectedNodes = myTreeView.Nodes.Descendants()
                    .Where(n => n.Checked)
                    .Select(n => n.Text)
                    .ToList();
Run Code Online (Sandbox Code Playgroud)

这种方法的一个优点是它是通用的.

但是,因为Descendant()方法遍历整个树,所以它可能比@mybirthname给出的答案效率低一些,因为它只关心与父项一起检查的节点.我不知道你的用例是否包含这个约束.

编辑:现在@mybirthname的答案已被编辑,它正在做同样的事情.现在你有了循环和LINQ解决方案,两者都是递归的.


myb*_*ame 7

public void GetCheckedNodes(TreeNodeCollection nodes)
{
    foreach(System.Windows.Forms.TreeNode aNode in nodes)
    {
         //edit
         if(!aNode.Checked)
             continue;

         Console.WriteLine(aNode.Text);

         if(aNode.Nodes.Count != 0)
             GetCheckedNodes(aNode.Nodes);
    }
} 
Run Code Online (Sandbox Code Playgroud)

你不要回顾孩子的笔记,使用递归就可以做到.

你需要像这样的方法!在您的代码中只需调用一次GetCheckedNodes(tvSastavnica.Nodes),所有已检查的节点都应显示!

  • 您的解决方案非常有效,但它基于以下假设:已检查的子节点也必须检查其父节点。不幸的是,如果检查深子节点而其父节点未检查,它将无法工作。因为问题中没有问到这个约束,我建议删除'continue'语句并恢复Checked测试,以便遍历整个树。 (2认同)

小智 6

我的方式:

void LookupChecks(TreeNodeCollection nodes, List<TreeNode> list)
{
    foreach (TreeNode node in nodes)
    {
        if (node.Checked)
            list.Add(node);

        LookupChecks(node.Nodes, list);
    }
}
Run Code Online (Sandbox Code Playgroud)

用途:

var list = new List<TreeNode>();
LookupChecks(TreeView.Nodes, list);
Run Code Online (Sandbox Code Playgroud)