【问题标题】:How to Efficiently Delete Checked Items from a TreeView?如何有效地从 TreeView 中删除选中的项目?
【发布时间】:2009-05-05 15:08:06
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net winforms treeview iteration


    【解决方案1】:

    尝试向后遍历节点。这样你的索引就不会超过你的节点大小:

    for(int ndx = nodes.Count;ndx > 0;ndx--) { TreeNode 节点 = 节点[ndx-1]; 如果(节点。检查) { 节点.删除(节点); } // 通过子节点递归... }

    【讨论】:

    • 这是最有效的方法。
    • 老问题,但 +1 是最有效的方法。
    • 重新审视这个...一些修改将使它变得如此之快...在 for 循环标题中进行以下更改:int ndx = nodes.Count-1ndx >= 0 将允许您避免-1 在每次通过循环时发生。从总体上看,一些额外的减法根本没有多大意义,但是,嘿……为什么不呢?
    【解决方案2】:

    这将在枚举完节点后删除它们,并且可以递归地用于 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您想有效地执行此操作,则需要在检查节点时跟踪它们。将选中的树节点存储在列表中(并在它们未选中时将其删除)。

      如果您有一个唯一键和大量节点来跟踪您,也可以考虑使用字典。但是如果你只处理 10-50 可能不会有很大的不同。

      然后,您无需循环遍历整个树,而是遍历(较小的)节点列表。

      【讨论】:

        【解决方案4】:

        在迭代时,您可以构建一个新的未选中项目列表,然后将您的树视图重新绑定到该新列表(丢弃旧列表)。

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 2016-07-25
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多