Flackern bei Aktualisierungen von Steuerelementen in WinForms (z. B. DataGridView)

7

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.

    
Grzenio 15.09.2008, 15:31
quelle

8 Antworten

7

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.

    
Skizz 16.09.2008, 08:13
quelle
8

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%     
Ken Wootton 15.09.2008 18:45
quelle
7

Die Leute scheinen eine einfache Lösung dafür zu vergessen:

%Vor%

Ich weiß, es scheint komisch, aber das funktioniert. Wenn das Objekt nicht sichtbar ist, wird es nicht neu gezeichnet. Sie müssen jedoch weiterhin das begin und end update durchführen.

    
Jon 04.06.2012 20:33
quelle
6

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:

  • Kontrollinhalte löschen - & gt; neu streichen
  • Spalten löschen - & gt; neu streichen
  • Neue Spalten füllen - & gt; neu streichen
  • Zeilen hinzufügen - & gt; neu streichen

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:

  1. Sie haben für jeden Datensatz ein anderes Steuerelement und zeigen / verbergen die Steuerelemente,
  2. Entfernen Sie das Steuerelement von seinem übergeordneten Element, aktualisieren Sie es und fügen Sie dann das Steuerelement erneut hinzu,
  3. Schreiben Sie Ihre eigene Kontrolle.

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.

    
Skizz 15.09.2008 15:57
quelle
2

Das hat für mich funktioniert.

Ссылка

Grundsätzlich beinhaltet es das Ableiten von dem gewünschten Steuerelement und das Festlegen der folgenden Stile.

%Vor%     
Brian Hasden 17.10.2008 13:49
quelle
1

Klingt so, als ob Sie Double-Buffering wollen:

Ссылка

Obwohl dies hauptsächlich für einzelne Steuerelemente verwendet wird, können Sie dies in Ihrem Windows Forms-Steuerelement oder Formular implementieren.

    
TheSmurf 15.09.2008 15:33
quelle
1

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.

    
TK. 15.09.2008 15:35
quelle
0

Sie können das auch versuchen, seine Arbeit.

%Vor%     
Ramgy Borja 10.08.2017 05:11
quelle

Tags und Links