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

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

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

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

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

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

 internal static IEnumerable Descendants(this TreeNodeCollection c) { foreach (var node in c.OfType()) { yield return node; foreach (var child in node.Nodes.Descendants()) { yield return child; } } } 

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

 var selectedNodes = myTreeView.Nodes.Descendants() .Where(n => n.Checked) .Select(n => n.Text) .ToList(); 

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

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

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

 public void GetCheckedNodes(TreeNodeCollection nodes) { foreach(System.Windows.Forms.TreeNode aNode in nodes) { //edit if(aNode.Checked) Console.WriteLine(aNode.Text); if(aNode.Nodes.Count != 0) GetCheckedNodes(aNode.Nodes); } } 

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

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

我的方式:

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

用途:

 var list = new List(); LookupChecks(TreeView.Nodes, list);