2012-02-07 44 views
3

當我們的項目優化UI我ListView中發現真的很奇怪提升了,不明白它從何而來。的WinForms ListView和TreeView控件:奇怪的性能問題

簡單增加5000元到ListView控件(查看:列表) - 3815毫秒:

for (int i = 0; i < 5000; i++) 
     listView1.Items.Add((Guid.NewGuid().ToString())); 

用的BeginUpdate()+ EndUpdate() - 2317毫秒:

listView1.BeginUpdate(); 
for (int i = 0; i < 5000; i++) 
    listView1.Items.Add((Guid.NewGuid().ToString())); 
listView1.EndUpdate(); 

帶隱藏()+顯示() - 163ms(無錯,超過10倍):

listView1.Hide(); 
for (int i = 0; i < 5000; i++) 
    listView1.Items.Add((Guid.NewGuid().ToString())); 
listView1.Show(); 

風格也改變了。 而不是2列現在我有4.

爲什麼這種方式是如此之快? 此外,爲什麼從隱藏的ListView開始(可見:false),並在羣體後顯示它不具有相同的性能提升?

TreeView的是不同的。簡單的添加5000個節點 - 2130毫秒:

for (int i = 0; i < 5000; i++) 
    treeView1.Nodes.Add((Guid.NewGuid().ToString())); 

帶隱藏()+展() - 1048毫秒:

treeView1.Hide(); 
for (int i = 0; i < 5000; i++) 
    treeView1.Nodes.Add((Guid.NewGuid().ToString())); 
treeView1.Show(); 

用的BeginUpdate()+ EndUpdate() - 291毫秒:

treeView1.BeginUpdate(); 
for (int i = 0; i < 5000; i++) 
    treeView1.Nodes.Add((Guid.NewGuid().ToString())); 
treeView1.EndUpdate(); 
+1

將您的項目添加到列表中,然後調用'AddRange(...)'也應該手動指定您的列,而不是信任控件來動態分配它們。 – Seph 2012-02-07 10:55:24

回答

2

這似乎是一個錯誤。當控件被隱藏時,它不會計算這些項的範圍(類似於Graphics.MeasureString或其本機等價物),當它們被添加時(這是有道理的),並且在稍後顯示控件時(它是可能是一個錯誤)。出於這個原因,你得到4列而不是2.請注意,當你得到2列時,項目不會被截斷,因爲執行了這個大小計算。當您獲得4列時,顯示通常不正確。

爲什麼不從一開始就被無形做到嗎?原因是,因爲在這種情況下,直到您調用Show方法或創建強制創建句柄的任何內容,纔會創建控件的句柄(底層Win32控件尚未創建)。然後,Show將首次創建句柄,並執行許多其他代碼,包括OnHandleCreated,此時代碼組織項目並計算其大小。

您可以檢查IsHandleCreated屬性爲false,直到第一個Show呼叫,如果控制是從一開始就看不見。

您也可以明確地創建一個句柄,即。通過簡單地嘗試讀取Handle屬性(這會強制要創建的手柄),然後它的工作方式 - 是快,但顯示是錯誤的:如果手柄前面創建

IntPtr handle = listView1.Handle; 
for (int i = 0; i < 5000; i++) 
    listView1.Items.Add((Guid.NewGuid().ToString())); 
listView1.Show(); 

中, OnHandleCreated以及大小計算也被調用,但在列表爲空時。

0

如果您添加元素與隱藏列表視圖..是元素後繪製元素,當您隱藏列表視圖,比它將一次繪製所有元素..

+0

真正的問題是: 爲什麼從隱藏的ListView開始(可見:false),並在羣體後顯示它沒有相同的性能提升? 爲什麼隱藏/顯示更改可見列數? – Kuba 2012-02-07 10:36:36

+0

相同的答案..因爲,如果它是可見的每一個元素,你正在添加的是繪製爲單一的(每個新的元素 - 繪製後調用)..但如果你隱藏組件和後顯示..它繪製在一個(添加所有元素,之後它全部使用gui).. – 2012-02-07 10:56:44