TableLayoutPanel sehr langsam?

multimolti

Erfahrenes Mitglied
Hallo!
Ich habe bei meinem Programm ein TableLayoutPanel verwendet. Die einzelnen Controls füge ich mit einer for-Schleife hinzu. Aber diese Tabelle ist in einem TabControl, und jedes mal, wenn ich zu diesem Tab gehe, dann baut sich die Tabelle erst langsam auf, also man sieht ca. 1 Sekunde lang wie die Elemente hinzugefügt werden.
An meinem Code liegt es nicht, ich tue nichts beim Wecheln des Tabs.
Kann man dieser Tabelle irgendwie sagen, sie soll ihr Layout speichern und nicht jedes mal neu aufbauen?

Danke für eure Hilfe!
 
Ok.
Mein TableLayoutPanel wurde vom FormDesigner erstellt, aber ich kopier den Code trotzdem mal rein:

C#:
            this.tbl_buildings.ColumnCount = 3;
            this.tbl_buildings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 132F));
            this.tbl_buildings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 94F));
            this.tbl_buildings.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 92F));
            this.tbl_buildings.Location = new System.Drawing.Point(6, 19);
            this.tbl_buildings.Name = "tbl_buildings";
            this.tbl_buildings.RowCount = 1;
            this.tbl_buildings.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.tbl_buildings.Size = new System.Drawing.Size(298, 326);
            this.tbl_buildings.TabIndex = 1;

Und hier mein Code um die Tabelle zu füllen:

C#:
            tbl_buildings.Controls.Clear();
            tbl_buildings.RowCount = manager.Buildings.Count;
            for (int i = 0; i < manager.Buildings.Count; i++)
            {
                Building building = manager.Buildings[i];

                Label lbl_name = new Label();
                Label lbl_level = new Label();
                LinkLabel lbl_build = new LinkLabel();

                lbl_name.Text = building.Name;
                                
                lbl_level.Text = "(Level " + building.Level + ")";
                                
                lbl_build.Name = building.Id.ToString();
                lbl_build.Click += new EventHandler(build_Click);
                lbl_build.Text = "Build";

                tbl_buildings.Controls.Add(lbl_name);
                tbl_buildings.Controls.Add(lbl_level);
                tbl_buildings.Controls.Add(lbl_build);

                
            }

Die for-Schleife wird aber ja nur ein mal aufgerufen, wenn ich einen Button drücke, aber jedes mal wenn ich den Tab wechsel dann muss er eben die Tabelle neu aufbauen. Das lustige an der Sache ist, dass wenn ich erst die Tabelle mit Clear() lösche und danach neu füllen lasse, dann hat das einen tollen "Rollladen"-Effekt, also erst fahren die Elemente so nach oben wenn sie gelöscht werden, und danach wieder nach unten :)
Will ich trotzdem nicht so haben^^

btw: Gibt es Tags für C#.-Code?

Und schaut euch dieses Video an: http://youtube.com/watch?v=1B8qIhq8Vqw :D :D :D
 
Zuletzt bearbeitet von einem Moderator:
Da du Tabs verwendest und natürlich auch hin-und-her schaltest passiert nun, dass beim Umschalten des Tabs der angezeigte Bereich als ungültig markiert wird, d.h. er wird neu gezeichnet. Und genau das ist das, was du eben als "flackern" bezeichnest. An diesem Verhalten wirst du nicht viel ändern können, ausser, einen stärkeren Rechner zu kaufen ;-) oder dir eine andere Darstellungsmöglichkeit zu überlegen.
 
Hey, glaubst du wirklich, dass ein 64-Bit Dual-Core mit 2x1,6 GHz und 2GB RAM nicht ausreichen, um eine blöde Tabelle zu zeichnen?
 
Wer weiß, könnte ja auch an der Grafikkarte liegen ;-)

Dann solltest dir vielleicht eine andere Variante überlegen ... an dem Behavior wirst du nicht sonderlich viel ändern können ...
 
Hmm, aber ich habe noch nie ein Programm gesehen, wo sich so eine Tabelle erst langsam aufbaut. Machen die das alles ohne Tabellen?

Und zu der Grafikkarte: Ja, meine Grafikkarte ist ein Drecksding, aber ich kann Crysis im Multiplayer (da ist Physik aus) ruckelfrei spielen, d.h. ein ganz normales Windowsprogramm sollte sie grade noch schaffen!
 
Ok danke, werd ich mir merken.

Weiß denn jemand eine Alternative zu der Tabelle?

Ich will Daten, die ich aus dem Internet bekomme, eben geordnet ausgeben, für alles brauche ich 3 Sachen, Name, Level und ein LinkLabel. Ich fand die Tabelle da ganz passend, denn das ganze mit einer for-Schleife und dann Pixel-Abstand-Multiplikator zu machen ist dann ja doch nicht sooo toll...
 
Probier's mal damit. Sollte grundsätzlich ein wenig besser sein:
C#:
public class TableLayoutPanelEx : TableLayoutPanel
{
    public TableLayoutPanelEx()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint |
          ControlStyles.OptimizedDoubleBuffer |
          ControlStyles.UserPaint, true);
    }
}
Du musst dein TableLayoutPanel nur mehr gegen das TableLayoutPanelEx tun. Dazu kannst du die Instanzierung in [myform].designer.cs ändern.
 
Zurück