2011-02-06 111 views
0

嘿所有, 我有一個winforms 虛擬化 Listview,我想能夠排序。 我實現了一個從IComparer派生的分類器類。 現在,我想我的排序列表視圖每次我這樣做:winforms虛擬列表視圖排序

public void SortMyVirtualListView() 
{ 
    this.VirtualListSize = 0; // set virtual size to 0 
    _myInnerList.Sort(_myComparer); // sort the inner listlistview items source) 
    this.VirtualListSize = _myInnerList.Count; // re-set the virtual size to items count 
} 

我要確保這是什麼 - 這真的是你如何排序後重新設置虛擬列表視圖的項目?我是否真的必須將虛擬列表大小設置爲0,然後將其重置爲新大小?

好像我不能省略關於VirtualListSize設定爲零,然後,在重新排序的基礎列表的一部分,設置VirtualListSize回其原始值(this.VirtualListSize = _myInnerList.Count)。

對於winforms的優化(和可排序)虛擬列表視圖,我找不到任何種類的令人滿意的代碼。

回答

2

設置VirtualListSize是否存在一些性能問題?這是有道理的,因爲ListView不知道你的內部列表已經改變,所以你需要以某種方式告訴它。 如果以這種方式重置VirtualListSize會導致性能問題,也許只是重繪可視項目會有所作爲?

_myInnerList.Sort(_myComparer); // sort the inner listlistview items source) 
int startIndex = this.TopItem == null ? 0 : this.TopItem.Index; 
int endIndex = Math.Min(startIndex + 100, this.VirtualListSize - 1); 
this.RedrawItems(startIndex, endIndex, true); 

(是的,我知道,我不喜歡的幻數100要麼... :)

編輯:排序應太后調用刷新()。

+0

有人發佈了一個答案,在內部列表的排序操作之後調用Invalidate()。它的工作..但我想調用RedrawItems()會快得多,對吧? – programmer 2011-02-08 19:17:48