2012-11-19 20 views
9

我有一個循環:性能幾百個改變的WinForms的位置的控制

for (int i = 0; i < panel1->Controls->Count; ++i) { 
    Control^ ctl = panel1->Controls[i]; 
    ctl->Location.Y = i*10; 
} 

它是好,如果我有200個或300控制在PANEL1? 或者它會更好,如果我補充一點:

if (ctl->Location.Y != i*10) ctl->Location.Y = i*10; 

我只是不知道.NET的控件將重新繪製無論如何(這需要時間),或者他們會自動檢查是否有沒有必要重繪(還是同一位置)

+0

我認爲你可以暫停渲染/轉發,這可能會加速這段代碼。 – CodesInChaos

+0

在這樣的情況下,你最好的朋友是反射器這樣的反編譯器。 – leppie

+0

@leppie我寧願先對它進行基準測試。 – CodesInChaos

回答

5

您可以優化它像如下,以避免連續重繪:

panel1.SuspendLayout(); 

for (int i = 0; i < panel1->Controls->Count; ++i) { 
{ 
    // do reposition 
} 

panel1.ResumeLayout(false); 
panel1.PerformLayout(); 

panel1.ResumeLayout() 

@CodesInChaos:好點! 它看起來是一樣的,但事實並非如此。要使用

  • ResumeLayout(假)/ PerformLayout()或
  • ResumeLayout()

會影響結果的樣子作爲解釋here

+3

爲什麼'ResumeLayout(false)'+'PerformLayout()'而不是'ResumeLayout()'? – CodesInChaos