-2

Ich habe eine tableLayoutPanel, die ich mit einem Windows Form verwenden. Das Steuerelement wird von einem datatable aufgefüllt, der SQL Server-Daten enthält. Ich habe bereits bestätigt, dass die select Aussage nicht das Problem ist.Kann das tableLayoutPanel optimal gefüllt werden?

Die Datentabelle wird häufig aktualisiert, daher wird auch die tableLayoutPanel häufig aktualisiert. Es funktioniert im Wesentlichen gut, aber es wird zu einem Punkt, dass es ein wenig langsamer wird und das Flackern ist auffälliger.

Jedesmal, wenn ich brauche die Steuerung zu aktualisieren, wird dieser Code ausgeführt:

public void FillTlp() 
{ 
    tableLayoutPanel1.Controls.Clear(); 
    tableLayoutPanel1.ColumnStyles.Clear(); 

    foreach (DataRow r in DT.Rows) 
    { 
     UcColor button = new UcColor(r); 
     tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
    } 
    this.Controls.Add(tableLayoutPanel1); 
}  

Da die immer 8 Zeilen haben wird, wie ich den folgenden Code in dem Formular Konstruktor ausführen nur einmal, aber ich sehe nicht, viel Nutzen:

public FormDoctorMonitor() 
{ 
    tableLayoutPanel1.RowStyles.Clear(); 
    tableLayoutPanel1.RowCount = 8; 
    FillTlp(); 
} 

Wie sonst kann ich die tableLayoutPanel optimieren bevölkern?

Danke.

+0

Offensichtliche Frage: Warum ist "refresh" tatsächlich "von Grund auf neu konstruieren"? Ändere nur, was geändert werden muss. – DonBoitnott

+0

Ohne [MCVE] (http:// Stackoverflow.com/help/mcve) ist es schwer zu sagen, was das Problem ist. Nur ein paar Tipps: ** 1 - ** Bevor Sie dem Panel neue Bedienelemente hinzufügen, müssen Sie die vorherigen Steuerelemente, die Sie hinzugefügt haben, mit "Dispose" versehen. Derzeit entfernst du sie nur. Sie sollten sowohl entfernen als auch entsorgen. ** 2 - ** Calling 'panel.SuspendLayout();' vor dem Entfernen von Steuerelementen und Aufruf von 'panel.ResumeLayout (true);' nach dem Hinzufügen neuer Steuerelemente kann helfen. –

+0

@RezaAghaei, wo soll ich 'tableLayoutPanel1.Dispose();'? Wenn ich es am Anfang hinzufüge, erhalte ich den Laufzeitfehler 'Kann auf das entsorgte Objekt nicht zugreifen'. Ich habe den Beispielcode mit Ihren Vorschlägen geändert. Bitte lassen Sie mich wissen, ob sie am richtigen Ort sind. – rbhat

Antwort

-1

Wenn ich etwas Anzeige Einfrieren habe, verwende ich diese Erweiterung Methode der Steuerung:

public static class ExtensionOfControl 
{ 
    private const int WM_SETREDRAW = 11; 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParmam); 

    public static void SuspendDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, false, 0); 
    } 
    public static void ResumeDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, true, 0); 
     parent.Refresh(); 
    } 

    public static void RunWithDrawingSuspended(this Control ctrl, Action code) 
    { 
     ctrl.SuspendDrawing(); 
     try 
     { 
      code(); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      ctrl.ResumeDrawing(); 
     } 
    } 
} 

Danach versuchen:

  this.RunWithDrawingSuspended(() => 
     { 
      tableLayoutPanel1.Controls.Clear(); 
      tableLayoutPanel1.ColumnStyles.Clear(); 

      foreach (DataRow r in DT.Rows) 
      { 

       UcColor button = new UcColor(r); 
       tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
      } 
      this.Controls.Add(tableLayoutPanel1); 
     }); 

Vielleicht können Sie ersetzen „this“ von Ihrem Table wenn bereits vorhanden auf "this"

+0

Wenn Sie [Code von jemand anderem nehmen] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children), Sie sind verpflichtet, ihnen dafür zu danken. –

+0

sorry cody grey ... zu dem Zeitpunkt, als ich wollte, habe ich nicht daran gedacht, die Referenzen des gefundenen Codes zu notieren. aber die erweiterungsmethode ist meine idee;) obwohl andere wohl auch gedacht werden – lolo

Verwandte Themen