Das ist wirklich einfach..Net TableLayoutPanel - Löschen von Steuerelementen ist sehr langsam
Ich habe ein TableLayoutPanel, das basierend auf einer Datenbankabfrage mit Steuerelementen (nur Labels, Schaltflächen und einige Panels mit Schaltflächen) gefüllt wird. Wenn die Daten aktualisiert werden müssen, verwende ich TableLayoutPanel.Controls.Clear(). Leider ist dies ein sehr langsamer Vorgang. Ich würde erwarten, dass es schneller ist als der Code, der die Tabelle füllt, aber es ist mindestens 3 oder 4 mal langsamer.
Ich habe definitiv bewiesen, dass die Langsamkeit ist, wenn Sie Controls.Clear() ausführen, indem Sie dies als das einzige getan, um das TableLayoutPanel getan, nachdem ein Meldungsfeld angezeigt wird (dann kehrt die Prozedur zurück). Die Kontrollen verschwinden sichtbar von unten nach oben. Wenn das Re-Cord-Set verwandt wird, um das TableLayoutPanel erneut zu befüllen, ist die Geschwindigkeit der Steuerelemente, die von Oben nach Unten angezeigt werden, fast schneller, als ich sehen kann.
Ich mache bereits TableLayoutPanel.SuspendLayout() und ResumeLayout().
Mit this.DoubleBuffered = true
auf dem Formular scheint nichts zu tun.
Ich könnte nur die gesamte Steuerung Dispose und neu erstellen es durch Code, aber das ist ein großer Schmerz und macht eine nette Form Designer GUI sinnlos. Ich müsste in jede Eigenschaft, die ich auf dem Steuerelement festgelegt habe, graben und eine Codezeile dafür erstellen (obwohl ich denke, dass ich das aus dem Designer-Code selbst herausholen könnte, fühlt es sich immer noch falsch an).
Haben Sie Ideen, wie Sie Ihre Arbeit schneller erledigen können? Ich bin sogar offen für die Verwendung anderer Methoden neben einem TableLayoutPanel ... Ich brauche nur die Freiheit, mehrere Schaltflächen pro Zelle zu setzen oder zu sperren, um Spalten in der Tabellenüberschrift zu überspannen.
Kann C# mindestens das gesamte Formular einfrieren, während es neu gezeichnet und dann auf einmal gezeichnet wird?
Sie erwähnen TableLayoutPanel und FlowLayoutPanel. –
Haben Sie einen Profiler darauf ausgeführt, um genau diese eine Codezeile zu beweisen? Ist es möglich, dass Sie mit dieser Codezeile Nebenwirkungen verursachen? Ereignisse, bei denen die Steuerung unsichtbar gemacht wird oder ähnliches? – WillfulWizard
@Willfulwizard Ich habe meinen Beitrag mit dem Grund aktualisiert, warum ich glaube, dass es die Controls.Clear() ist, die eine lange Zeit braucht. – ErikE