8
votes

.NET TableLayOntPanel - Les commandes de compensation sont très lentes

C'est vraiment simple.

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.

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.

Je fais déjà TableLayOntPanel.suspendlayout () et Resumelayout ().

Utilisation this.doublebuffered = true sur le formulaire ne semble rien faire.

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).

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.

peut c # au moins geler le formulaire entier pendant qu'il redessinait puis peindre tout à la fois?


3 commentaires

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.


4 Réponses :


0
votes

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 xxx

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 textbox et monte dans les conteneurs tels que groupbox ou TableLayOntPanel .

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 USERCONTROL , mais comme toujours cela dépend si cela est nécessaire ou non.

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.


0 commentaires

9
votes

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;
    }
}


3 commentaires

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!



6
votes

Cela semble fonctionner pour mes utilisations: xxx


0 commentaires

3
votes

Il n'y a pas besoin de sous-classe TableLayOntPanel 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: xxx


0 commentaires