在树视图中获取所有选中节点及其子节点的列表
本文关键字:子节点 节点 列表 视图 获取 | 更新日期: 2023-09-27 18:27:43
我有一个树视图列表复选框,该列表包含节点、子节点,在某些情况下还包含子节点的子节点。当用户选中某些项目时,我想获得所选项目的列表。
关于这一点,为什么我只得到主节点的精选项目:
foreach (System.Windows.Forms.TreeNode aNode in tvSastavnica.Nodes)
{
if (aNode.Checked == true)
{
Console.WriteLine(aNode.Text);
}
}
如何遍历整个树视图并在子节点中获取检查项?
如果你喜欢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;
}
}
}
然后,您可以使用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)
continue;
Console.WriteLine(aNode.Text);
if(aNode.Nodes.Count != 0)
GetCheckedNodes(aNode.Nodes);
}
}
你不需要回顾孩子的笔记,使用递归你可以做到
你需要这样的方法!在您的代码中,只需调用一次GetCheckedNodes(tvSastavnica.Nodes)
,所有选中的节点都会显示出来!
我的方式:
void LookupChecks(TreeNodeCollection nodes, List<TreeNode> list)
{
foreach (TreeNode node in nodes)
{
if (node.Checked)
list.Add(node);
LookupChecks(node.Nodes, list);
}
}
用途:
var list = new List<TreeNode>();
LookupChecks(TreeView.Nodes, list);