2008-12-24 57 views
8

是否有一種簡單的方法可以將節點添加到WinForms .NET TreeView控件,其中添加的新節點被插入到正確的索引處,以便整個節點列表按字母順序排序?與TreeView.Sort()具有相同的結果。在添加節點時自動對TreeView排序

我有一個TreeView,不斷增長到幾百個節點。用戶可以隨着它的增長實時查看這個TreeView。我寧願只將節點插入正確的索引處,而不是在每次添加節點後調用TreeView.Sort()。

可以這樣做嗎?

回答

24

在的WinForms,你可以TreeView的.Sorted屬性只是設置爲True

當排序設置爲true,則 TreeNode對象在 字母順序排列它們的Text屬性 值排序。你應該總是使用 的BeginUpdate和EndUpdate添加項目的大 量排序的 的TreeView時保持 性能。當現有的 節點的文本發生更改時,必須調用Sort到 來查找這些項目。

參考MSDN

5

你爲什麼不創建新類,從TreeViewTreeNodeCollection繼承?新的TreeView將使用您的新TreeNodeCollection,您可以覆蓋TreeNodeCollectionAdd()方法以執行您的建議。

的方法必須: 1.找到正確的位置,以插入和2.插入新的節點。

最簡單的實現將通過收集迭代,直到thisNode.value<=newNode.value<nextNode.value。然後在nextNode.Index之前插入。如果使用不同的搜索算法,則可以看到性能提高,具體取決於集合的大小。 (如二進制搜索的東西浮現在腦海。)

注意:你也可以只創建一個TreeNodeCollection,做同樣的事情的擴展方法。但是,覆蓋Add()方法可確保您的TreeView總是排序。只創建擴展方法可能會導致未定義的結果,如果它尚未在您的AddIntoSorted()調用之前排序。

+1

這可能已經很容易改變,因爲你的職位是6歲,但看起來就像你不能繼承`TreeNodeCollection`現在。它有一個[帶`internal`訪問修飾符的構造函數。](http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeNodeCollection.cs) – 2015-02-24 15:59:50

+2

@DarrenHale有趣。令人討厭的是,因爲我猜你必須重新發明輪子,然後讓你的新的`TreeView`使用新的集合。感謝您的提醒。 – 2015-02-25 01:02:06