2012-11-19 12 views
9

mam pętlę:Wydajność zmieniając położenie setek WinForms kontroluje

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

Czy to w porządku, jeśli mam 200 lub 300 kontrole w Panel1? Albo będzie lepiej jeśli dodać to:

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

ja po prostu nie wiem, czy kontrole NET będzie przemalować i tak (to zajmie czasu) lub będą one automatycznie sprawdzić, czy nie ma potrzeby do odświeżenia (ciągle to samo miejsce)

+0

Myślę, że możesz zawiesić rendering/przekazywanie, co może przyspieszyć ten kod. – CodesInChaos

+0

W takich sytuacjach najlepszym przyjacielem jest dekompilator taki jak Reflector. – leppie

+0

@poppel Najpierw chciałbym to przetestować. – CodesInChaos

Odpowiedz

5

można zoptymalizować to jak następuje, aby uniknąć ciągłego Przemalowanie:

panel1.SuspendLayout(); 

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

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

lub

panel1.ResumeLayout() 

@CodesInChaos: Dobra uwaga! Wygląda na to samo, ale tak nie jest. Aby korzystać

  • ResumeLayout (false)/PerformLayout() lub
  • ResumeLayout()

wpłynie jak wynik wygląda jak wyjaśniono here.

+3

Dlaczego 'ResumeLayout (fałsz)' + 'PerformLayout()' zamiast 'ResumeLayout()'? – CodesInChaos

Powiązane problemy