2017-01-27 4 views
2

Ich benutze Windows Forms C#.Wie verhindert man, dass DataGridView beim horizontalen Scrollen flimmert?

Screen Shot

Wie in dem Bildschirm dargestellt ist, habe ich eine Form, die eine Benutzersteuerung, eine Registersteuer und einen Datagridview (30 Zeilen und 17 Spalten) aufweist. Ich lese Daten von SQL Server, um das DataGrdiView zu füllen.

Die Frage:

Wenn ich horizontal scrollen die DataGridView flackert viel. Das vertikale Scrollen funktioniert jedoch perfekt ohne Flackern.

hatte ich einen Blick here, here, here und here aber keiner von ihnen auf meine Frage im Zusammenhang.

Wer kennt keine Lösung, die verhindert, dass DataGridView beim horizontalen Scrollen flimmert.

+1

Haben Sie versucht, die doppelte Pufferung in der Form zu aktivieren? – Carles

+0

Ich denke es ist wegen der Ereignisse, welche Ereignisse verwenden Sie für Raster? –

+0

@Carles. Nein. Können Sie mir bitte sagen, wie es geht, ich bin neu in C# – Sam

Antwort

6

Alles, was Sie brauchen, ist zu verwenden, um eine DoubleBufferedDataGridviewUnterklasse:

class DBDataGridView : DataGridView 
{ 
    public DBDataGridView() { DoubleBuffered = true; } 
} 

Es ist auch möglich, doppelte Pufferung in eine normale out-of-the-Box-Steuerung zu injizieren, aber ich ziehe haben als auch eine Klasse von meinem eigenen, da dies ist erweiterbar auf andere Weise ..

ich die Klasse von einer öffentlichen Eigenschaft erweitert, damit DoubleBuffering Ein- und ausschalten ..:

public class DBDataGridView : DataGridView 
{ 
    public new bool DoubleBuffered 
    { 
     get { return base.DoubleBuffered; } 
     set { base.DoubleBuffered = value; } 
    } 

    public DBDataGridView() 
    { 
     DoubleBuffered = true; 
    } 
} 

..und getestet mit einer Last von 200 Spalten und 2000 Zeilen. Der Unterschied ist offensichtlich; während vertikales Scrollen ohne DoubleBuffering ..

muss horizontales Scrollen funktioniert hat

enter image description here

Beachten Sie, dass das Formular auch eine DoubleBuffering Eigenschaft hat, aber das wird nicht auf alle eingebetteten Kontrollen propagieren!

+0

Gibt es einen anderen Weg? Ich suche nach etwas wie 'dgv.DoubleBuffered = true;'. –

+0

Ich habe die Antwort aktualisiert, um eine 'neue DoubleBuffered' Eigenschaft hinzuzufügen. – TaW

1

Verwendung dieser Klasse

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

und diesen Code eingeben.

this.dataGridView1.DoubleBuffered(true); 

genießen.

Verwandte Themen