【问题标题】:Sort TreeView Automatically Upon Adding Nodes添加节点时自动对 TreeView 进行排序
【发布时间】:2008-12-24 05:12:27
【问题描述】:

是否有一种简单的方法可以将节点添加到 WinForms .NET TreeView 控件,其中正在添加的新节点插入到正确的索引处,以便整个节点列表按字母顺序排序?与TreeView.Sort() 的结果几乎相同。

我有一个不断增长到几百个节点的 TreeView。用户可以随着它的增长实时查看这个 TreeView。我宁愿只在正确的索引处插入节点,而不是在每次添加节点后调用 TreeView.Sort()。

这个可以吗?

【问题讨论】:

    标签: .net winforms sorting treeview


    【解决方案1】:

    在 winforms 中,您可以简单地将 TreeView 的 .Sorted 属性设置为 True

    当 Sorted 设置为 true 时, TreeNode 对象排序在 按其文本的字母顺序 属性值。您应该始终使用 BeginUpdate 和 EndUpdate 维护 添加大容量时的性能 排序的项目数量 树视图。当现有的文本 节点改变了,你必须调用 Sort 来 处理这些项目。

    参考MSDN

    【讨论】:

    • 有趣的是(至少对我而言) .Sorted 属性没有出现在 TreeView 的 VS 属性列表中,也没有出现在 Intellisense 中。也许这是一个疏忽。正如您所指出的,MSDN 文档清楚地提到了它,但很多时候我倾向于“点击点键”来最初访问属性,然后如果我没有看到我正在寻找的内容,请检查文档。我最初忽略了 Sorted 属性,它确实对列表排序的效率产生了影响。最初将 .Sorted 设置为 true 比之后调用 Sort() 快得多。
    • 对我来说,它也不会出现在属性列表中,但手动编码也可以——tree.Sorted = true
    • 如果要设置排序器,请使用msdn.microsoft.com/en-us/library/…
    【解决方案2】:

    为什么不创建继承自TreeViewTreeNodeCollection 的新类?新的TreeView 将使用您的新TreeNodeCollection,您可以覆盖TreeNodeCollectionAdd() 方法来执行您的建议。

    该方法必须: 1. 找到要插入的正确位置 2. 插入新节点。

    最简单的实现将遍历集合直到thisNode.value<=newNode.value<nextNode.value。然后在nextNode.Index 之前插入。如果您使用不同的搜索算法,您可能会看到性能提升,具体取决于集合的大小。 (想到类似二分搜索的东西。)

    注意:您也可以在 TreeNodeCollection 上创建一个扩展方法来做同样的事情。但是,覆盖Add() 方法可确保您的TreeView始终 排序。如果在您的 AddIntoSorted() 调用之前尚未对扩展方法进行排序,则仅创建扩展方法可能会导致未定义的结果。

    【讨论】:

    • 这可能很容易改变,因为您的帖子已有 6 年历史,但看起来您现在不能继承 TreeNodeCollection。它有一个constructor with the internal access modifier.
    • @DarrenHale 有趣。烦人,因为我猜你必须重新发明轮子然后让你的新TreeView 使用新的集合。感谢您的提醒。
    猜你喜欢
    • 2018-01-16
    • 2017-01-01
    • 2018-11-28
    • 1970-01-01
    • 2016-06-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多