In meiner Anwendung habe ich ein DataGridView-Steuerelement, das Daten für das ausgewählte Objekt anzeigt. Wenn ich ein anderes Objekt (in einer Combobox oben) auswähle, muss ich das Gitter aktualisieren. Leider haben verschiedene Objekte völlig unterschiedliche Daten, sogar unterschiedliche Spalten, daher muss ich alle vorhandenen Daten und Spalten löschen, neue Spalten erstellen und alle Zeilen hinzufügen. Wenn das erledigt ist, flackert die gesamte Steuerung furchtbar und es dauert ewig. Gibt es eine generische Möglichkeit, das Steuerelement in einem Update-Zustand zu erhalten, so dass es sich nicht neu erstellt, und neu streichen, nachdem ich alle Updates abgeschlossen habe?
Bei TreeViews ist das sicher möglich:
%Vor%Gibt es eine generische Möglichkeit, dies mit anderen Steuerelementen, insbesondere DataGridView, zu tun?
UPDATE: Tut mir leid, ich bin mir nicht sicher, ob ich das klar genug habe. Ich sehe das "Flackern", weil das Steuerelement nach der Einzelbearbeitung auf dem Bildschirm neu gezeichnet wird, so dass die Bildlaufleiste schrumpft usw.
Anstatt die Zeilen des Datenrasters nacheinander hinzuzufügen, verwenden Sie die Methode DataGridView.Rows.AddRange
, um alle Zeilen gleichzeitig hinzuzufügen. Das sollte das Display nur einmal aktualisieren. Es gibt auch ein DataGridView.Columns.AddRange
, um das Gleiche für die Spalten zu tun.
Das .NET-Steuerelement unterstützt SuspendLayout und < a href="http://msdn.microsoft.com/en-us/library/y53zat12.aspx"> ResumeLayout Methoden. Wählen Sie das entsprechende übergeordnete Steuerelement aus (d. H. Das Steuerelement, das die Steuerelemente enthält, die Sie auffüllen möchten) und führen Sie Folgendes aus:
%Vor%Die doppelte Pufferung wird hier nicht helfen, da nur die Bufferoperationen doppelt gepuffert werden. Das Flackern, das das OP sieht, ist das Ergebnis mehrerer Maloperationen:
Das sind also vier Repaints, um das Steuerelement zu aktualisieren, daher das Flimmern. Leider haben nicht alle Standardsteuerelemente das BeginUpdate / EndUpdate, das alle Repaint-Aufrufe löscht, bis das EndUpdate aufgerufen wird. Folgendes können Sie tun:
Die Optionen 1 und 2 würden immer noch ein wenig flackern.
Im .NET GUI-Programm, an dem ich gerade arbeite, habe ich eine Reihe von benutzerdefinierten Steuerelementen erstellt, die das gesamte Flimmern eliminieren.
Das hat für mich funktioniert.
Grundsätzlich beinhaltet es das Ableiten von dem gewünschten Steuerelement und das Festlegen der folgenden Stile.
%Vor%Leider denke ich, dass Thins möglicherweise nur ein Nebenprodukt des .NET-Frameworks sind. Ich habe ein ähnliches Flimmern, allerdings mit benutzerdefinierten Steuerelementen. Viele der Referenzmaterialien, die ich gelesen habe, weisen darauf hin, neben der Tatsache, dass die doppelte Pufferung kein Flimmern für mich beseitigen konnte.