如何轻松地遍历 TreeView 中的所有节点,检查它们的 .Checked 属性,然后删除所有选中的节点?
这看起来很简单,但您不应该修改正在迭代的集合,从而消除了“foreach”循环的可能性。 (.Nodes.Remove 调用正在修改集合。)如果尝试这样做,结果是只有大约一半的 .Checked 节点被删除。
即使使用两次遍历:首先创建一个临时索引列表,然后在第二次遍历中按索引删除——每次删除时索引都会更改,从而使索引列表的完整性无效。
那么,最有效的方法是什么?
这是一个看起来不错的代码示例,但实际上只删除了大约一半的 .Checked 节点。:
foreach (TreeNode parent in treeView.Nodes)
{
if (parent.Checked)
{
treeView.Nodes.Remove(parent);
}
else
{
foreach (TreeNode child in parent.Nodes)
{
if (child.Checked) parent.Nodes.Remove(child);
}
}
}
(是的,目的只是从两层深的树中修剪节点。)
最佳答案
尝试向后遍历节点。这样你的索引就不会增加超过你的节点大小:
for( int ndx = nodes.Count; ndx > 0; ndx--) { TreeNode node = nodes[ndx-1]; if (node.Checked) { nodes.Remove(node); } // Recurse through the child nodes... }
关于c# - 如何有效地从 TreeView 中删除选中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825323/