c# - 如何有效地从 TreeView 中删除选中的项目?

标签 c# .net winforms treeview iteration

如何轻松地遍历 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/

相关文章:

c# - 如何实现序列的约束改组

.net - .net 中的不可变数组 (c#) : Reasonable approach?

c# - List<Interface> 执行顺序

c# - 无法使用带有 Visual Studio 2010 的 Windows 窗体取回设计器 View 窗口

c# - 即使文件在同一个文件夹中,也会出现 FileNotFoundException

c# - 暴露底层控制的事件

c# - FFMpeg转换器。 ConvertLiveMedia 方法不起作用

c# - 在 C# 中使用 `dynamic` 关键字不编译

c# - Form.closed 事件未触发

c# - 重构该代码... Controls.Find 方法