我已經設置了一個包含多個選項卡的對話框。其中一個包括23個組合框,每超過100個項目,增加這樣的:顯示帶有很多ComboBox控件的選項卡與WinForms很慢
foreach (var x in collection)
{
string text = FormatItem (x);
combo.Items.Add (text);
}
所以沒有什麼花哨的所有項目。它們是純字符串,組合框在創建對話框時被填充。這幾乎是即時發生的。
但是,當用戶第一次單擊包含所有這些組合框的選項卡時,GUI會凍結幾秒鐘(並且我正在運行一臺非常健壯的機器)。
我加載了System.Windows.Forms
的符號,並試圖在程序卡住時進入調試器。我發現是一個堆棧跟蹤與以下電話:
System.Windows.Forms.Control.CreateHandle()
System.Windows.Forms.ComboBox.CreateHandle()
System.Windows.Forms.Control.CreateControl(...) x 3
System.Windows.Forms.Control.SetVisibleCore(true)
System.Windows.Forms.TabPage.Visible.set(true)
這將導致大量的原始過渡,WndProc
調用等我想這種情況發生在每一個組合框的每一個項目。唷。
顯然,我無法優化WinForms。但是,也許我可以採取一些行動,以避免所有這一切在我的可憐的圖形用戶界面上失去?有任何想法嗎?
諾塔好處:
我已經把它貼在組合框時,你得到真正的創建控件可稱爲無事件處理程序。
如果我在創建並填充表單後嘗試訪問組合框的
Handle
屬性,那麼我在此時支付罰款,而不是當標籤第一次變爲可見時。但是在創建表單時不得不等待幾秒鐘也是不可接受的。我真的想擺脫很長的設定時間。應用
BeginUpdate
和EndUpdate
的想法在這裏不適用:這些應該用於防止控件在其項目列表被填充時重新繪製。但就我而言,在控制設置完成後,問題發生得很好。
是的,推遲填充控件的項目可以工作......但它需要相當多的調整,因爲我不能使用`SelectedIndex`和其他這樣的屬性。 – 2009-02-24 13:28:50