如何轻松遍历TreeView中的所有节点,检查它们的.Checked属性,然后删除所有已选中的节点?
这似乎很简单,但你不能通过正在迭代的集合来修改它,因此无法使用“foreach”循环。(调用.Nodes.Remove正在修改集合。)如果尝试这样做,其效果是仅删除了大约一半的.Checked节点。
即使使用两个步骤:首先创建一个临时索引列表,然后在第二个步骤中按索引删除 - 索引也会随着每次删除而更改,从而使索引列表的完整性失效。
那么,最有效的方法是什么呢?
下面是一个看起来很好的代码示例,但实际上只删除了约一半的.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);
}
}
}
(是的,意图只是从树中修剪两级深度的节点。)
int ndx = nodes.Count-1
并且ndx >= 0
将使你避免每次通过循环时发生的-1。总体来说,多几次减法并不意味着太多,但是嘿...为什么不呢? - TimFoolery