2009-08-17 104 views
2

我在窗體上有一個ListView:TListview,並且添加了很多值(大約25k TListViewItem),它的工作速度非常快,但是當我調用Listview.Clear時,程序凍結了。我使用調試器對其進行了檢查, t步那條線。TListView.Clear凍結我的應用程序,我該如何解決它?

我的問題是:我該如何解決我的問題?如果在不到一秒的時間內創建這麼多項目是可能的,爲什麼刪除它們需要永久(我等了超過5分鐘)?

回答

13

您是否嘗試過封閉您的來電清除在的BeginUpdate/EndUpdate塊:

listview.Items.BeginUpdate; 
    try 
    listview.Items.Clear; 
    finally 
    listview.Items.EndUpdate; 
    end; 

添加/在ListView(或其他各種控件,如列表框)刪除項目引發的一個GUI更新控制每個添加/刪除的項目。對於特別的列表視圖來說,這可能相當昂貴,對於25,000個項目而言,開銷會很大。

無可否認5分鐘聽起來過度,但這將是我會嘗試的第一件事。

5

我想嘗試的第一件事就是將您的調用封裝到Clear with BeginUpdate/EndUpdate。

ListView1.Items.BeginUpdate; 
    ListView1.Clear; 
    ListView1.Items.EndUpdate; 

你有任何附加到ListView的事件,並且它們是否在列表被清除時觸發?

+0

不,我在第一個地方使用開始/結束更新。它是一樣的。 – 2009-08-17 21:31:12

+0

那段時間正在某個地方度過。有任何事件發生?我會使用斷點或CodeSite/OutputDebugString消息來查看。我喜歡CodeSite,因爲它有一個IDE插件,可以將EnterMethod/ExitMethod消息放入單元中的所有(或多個)方法中。 – 2009-08-17 21:54:46

2

正如其他人指出BeginUpdate .... EndUpdate將大大提高性能,但我真的建議你移動你的代碼來使用VirtualTreeView。這是一個混合樹/ ListView,它將在不到一秒的時間內添加多達1百萬個節點(實際上取決於處理器,但你明白了)。

開始學習有點困難,但一旦習慣了它,你會發現它很容易處理。我個人每當我需要在ListView或TreeView中看到很多行時,都不會比VirtualTreeView更遠。哦,忘了提及它,它是免費的。嘗試它:http://soft-gems.net/

2

約翰,它不應該再長時間清除比添加25k項目。
我不知道你是否加載它時,它不可見(自動禁用更新),但清除它時,它是可見的每個項目刪除觸發更新。

+0

它是可見的.BeginUpdate/EndUpdate是用戶。 – 2009-08-17 21:32:23

0

我不知道我是否應該刪除這個問題,我相信這不會對任何人有任何用處,但我寧願保留它至少一段時間,至少對於你,誰回答。

問題是我使用了一個從TListView繼承的組件,我認爲這不會是一個問題,所以我決定說TListView,但我錯了。

我提出了所有的答案,請原諒我的無知 - 我是新的。

+0

不要流汗。那麼,你使用的是什麼組件?有些東西是在家種的,還是來自第三方? – 2009-08-17 22:25:56

+0

AlphaControls,它是一個整體的皮膚包,控件從borland的vcl繼承而來,它們的skinView(TsSkinView)非常糟糕。 – 2009-08-17 22:45:23

+0

究竟是什麼問題?他們的明確代碼太慢了嗎?爲什麼呢? – jpfollenius 2009-08-18 06:46:26

相關問題