2012-11-19 1 views
9

je boucle:Performance de changer la position des centaines de WinForms contrôle

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

Est-il correct si j'ai 200 ou 300 contrôles dans panel1? Ou ce sera mieux si j'ajoute ceci:

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

Je ne sais pas si les contrôles de .NET repeindre toute façon (il faudra du temps) ou ils vérifie automatiquement s'il n'y a pas besoin de repeindre (encore même endroit)

+0

Je pense que vous pouvez suspendre le rendu/la sortie de relais, ce qui pourrait accélérer ce code. – CodesInChaos

+0

Dans des situations comme celles-ci, votre meilleur ami est un décompilateur comme Reflector. – leppie

+0

@leppie Je préférerais le comparer en premier. – CodesInChaos

Répondre

5

Vous pouvez optimiser comme suit pour éviter repeindre continue:

panel1.SuspendLayout(); 

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

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

ou

panel1.ResumeLayout() 

@CodesInChaos: Bon point! Il semble que ce soit la même chose, mais ce n'est pas le cas. Pour utiliser

  • ResumeLayout (false)/PerformLayout() ou
  • ResumeLayout()

influencera la façon dont le résultat ressemble comme expliqué here.

+3

Pourquoi 'ResumeLayout (false)' + 'PerformLayout()' au lieu de 'ResumeLayout()'? – CodesInChaos

Questions connexes