C'est vraiment simple. p>
J'ai un tableau natal qui est renseigné avec des commandes (juste des étiquettes, des boutons et des panneaux avec des boutons) basés sur une requête de base de données. Lorsque les données doivent être rafraîchies, j'utilise TableLayOntPanel.Controls.Clear (). Malheureusement, c'est une opération très lente. Je m'attendrais à ce que ce soit plus rapide que le code qui remplit la table, mais il est au moins 3 ou 4 fois plus lent. P>
J'ai définitivement prouvé que la lenteur est lors de l'exécution de Controls.Clear () en exécutant cela comme une seule chose faite au tableau TableLayOntPanel une fois que la boîte de message est affichée (la procédure renvoie). Les commandes disparaissent visiblement du bas vers le haut. Lorsque le jeu d'enregistrements est utilisé pour repeupler la nappablePanel, la vitesse des commandes apparaissant de haut en bas est presque plus rapide que je ne peux voir. P>
Je fais déjà TableLayOntPanel.suspendlayout () et Resumelayout (). P>
Utilisation Je pourrais simplement disposer tout le contrôle et le recréer par le code, mais c'est une grosse douleur et fait avoir une bonne forme d'interface graphique de forme. Je devrais creuser dans toutes les propriétés que j'ai énumérées sur le contrôle et créer une ligne de code pour cela (bien que je suppose que je pourrais obtenir cela du code de concepteur lui-même, il se sent toujours faux). P>
Des idées sur la façon de faire le travail plus rapide? Je suis même ouvert à l'utilisation d'autres méthodes en dehors d'une nappablePanel ... J'ai juste besoin de la liberté de mettre plusieurs boutons par cellule ou de l'empêcher de pouvoir couvrir les colonnes de l'en-tête de la table. P>
peut c # au moins geler le formulaire entier pendant qu'il redessinait puis peindre tout à la fois? P> this.doublebuffered = true code> sur le formulaire ne semble rien faire. P>
4 Réponses :
Si je vais avoir construit une interface graphique dynamique, je vais toujours le faire en code. Mais à un point de départ, je viens de commencer par le concepteur sur une forme mannequin et un style chaque contrôle de la manière dont je (ou meilleur le client) comme (s). Ensuite, je jetez un coup d'oeil dans le fichier designer.cs et copiez les paramètres de la propriété nécessaires dans une fonction d'usine comme donc je m'assure que chaque contrôle ressemble et ressemble au même à mon GUI. Cela se fera sur chaque niveau de ma surface (en commençant par les petites commandes telles que Dans certains cas, cela conduit à un point où une fonction d'usine appelle plusieurs autres fonctions d'usine. Si cela est vrai, il est temps de penser à encapsuler ces commandes dans un seul de mon côté, je ne peux que vous encourager à déplacer votre code hors du concepteur en une fonction auto-écrite. À Le début est (comme toujours) plus de travail, mais il est ensuite plus facile de gagner encore plus gros changements à la mise en page. P> p> textbox code> et monte dans les conteneurs tels que
groupbox code> ou
TableLayOntPanel code>. p>
USERCONTROL code>, mais comme toujours cela dépend em> si cela est nécessaire ou non. p>
Je rencontre des problèmes avec la lenteur à l'aide de TableLayOntPanels aussi. Plutôt que de définir la propriété DoubleBuffered sur la forme, la meilleure solution que j'ai trouvée consiste à créer une nouvelle classe qui hérite de TableLayOntPanel et dans ce constructeur de classe, active double tampon:
public class DoubleBufferedTableLayoutPanel : TableLayoutPanel { public DoubleBufferedTableLayoutPanel() { DoubleBuffered = true; } }
Pourriez-vous spéculer sur la raison pour laquelle vous pensez que c'est? Le TableLayOntPanel a une propriété double-capuchée, elle-même ... pourquoi pas seulement la mettre au moment de la conception (je suppose que cela ne fonctionne pas cependant)? Alors, quelle est l'accord?
Dans la version de .net, j'utilise (2008, SP1), ni la barre d'outils de propriétés ni IntelliSense énumère la propriété DoubleBuffered pour TableLayOntPanels. Si vous avez une instance d'un tableau nappanoudpanel, dites MyTablelayOntPanel et essayez de définir MyTablAYAYOutPanel.doublebuffered = true, le compilateur affichera un "Impossible d'accéder à un membre protégé" System.Windows.Forms.Control.doublebuffered "". Si votre version de .NET propose effectivement la propriété DoubleBuffered sur l'ordinaire TableLayOntPanel, alors j'imagine l'établir de la définir, il fonctionnerait bien.
Je dois dire que je n'aurais jamais été censé avoir à faire cette sorte de tweak, encore moins d'avoir une incidence sur la performance d'une telle façon étonnamment positive. Stuff soie!
Cela semble fonctionner pour mes utilisations:
Il n'y a pas besoin de sous-classe TableLayOntPanel Code> comme dans La réponse de Chris Ryan . J'ai eu le même problème et l'a résolu en définissant la propriété par la réflexion:
Vous mentionnez TableLayoutPanel et FlowlayOutpanel.
Avez-vous exécuté un profileur dessus pour prouver que c'est exactement cette ligne de code? Est-il possible que vous causez des effets secondaires sur cette ligne de code? Les événements étant appelés pour que les contrôles soient invisibles ou similaires?
@Willulfulwizard J'ai mis à jour mon message avec la raison pour laquelle je crois que c'est le contrôle.Clear () qui prend beaucoup de temps.