c# – 如何从TreeView中有效删除已检查的项目?

如何轻松遍历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);
                    }
                }
            }

(是的,目的只是从两层深度的树中修剪节点.)

最佳答案
这将在枚举后删除节点,并且可以递归地用于n层节点.

void RemoveCheckedNodes(TreeNodeCollection nodes)
{
    List<TreeNode> checkedNodes = new List<TreeNode>();

    foreach (TreeNode node in nodes)
    {
        if (node.Checked)
        {
            checkedNodes.Add(node);
        }
        else
        {
            RemoveCheckedNodes(nodes.ChildNodes);
        }
    }

    foreach (TreeNode checkedNode in checkedNodes)
    {
        nodes.Remove(checkedNode);
    }
}

转载注明原文:c# – 如何从TreeView中有效删除已检查的项目? - 代码日志