2008-10-31 3 views
9

Wir hatten ein Performance-Problem mit DataGridViews wo die Neuzeichnung horridly langsam war und fand die Lösung Here einen abgeleiteten Typen zu erstellen und doppelte Pufferung auf der Steuerung zu ermöglichen. (Abgeleiteter Typ ist erforderlich, da die DoubleBuffered-Eigenschaft geschützt ist)Warum ist die DoubleBuffered-Eigenschaft in einer DataGridView standardmäßig auf "false" gesetzt und warum ist sie geschützt?

Es scheint keinen Nachteil zu geben, dass die DoubleBuffered-Eigenschaft auf true festgelegt ist.

Antwort

1

Die doppelte Pufferung verwendet per Definition zwei Puffer und doppelt so viel Speicher für die Darstellung des Steuerelements in. Also gibt es da einen Nachteil, aber mit der Menge an Speicher, die du jetzt in einem PC bekommst, würden wahrscheinlich nicht viele Leute das Opfer bemerken.

Keine Ahnung, warum seine geschützt. Vielleicht war die Funktion in einer frühen Version des Steuerelements nicht verfügbar, und als sie eingeführt wurde, wollten die Designer die öffentliche Schnittstelle des Steuerelements nicht ändern. Oder vielleicht betrachteten sie es als ein fortgeschrittenes Feature und wollten die Anzahl der Methoden begrenzen, die jemand, der neu in der Steuerung ist, haben müsste, um etwas Nützliches machen zu können.

+1

Warum die downvote? Ist etwas, was ich falsch geschrieben habe? –

15

Es sind geschützt, denn DGV die Eigenschaft von Control erbt. Und Control.DoubleBuffered ist geschützt. Das macht Sinn, weil jede abgeleitete Kontrolle dafür entscheiden sollte, das einzuschalten. Und es macht keinen Sinn für den Steuerbenutzer, ihn willkürlich ein- oder auszuschalten. Die DGV Designer entschieden sich für off.

Ein Grund, warum sie vielleicht entschieden haben, ist, dass doppelte Pufferung das Malen tatsächlich langsamer macht. Der zusätzliche Schritt zum Rendern der Puffer-Bitmap kostet Zeit. Es sieht für das menschliche Auge einfach schneller aus, Sie beobachten, wie die Bitmap plötzlich erscheint. Sie können nicht die Zeit sehen, die zum Zeichnen in die Bitmap benötigt wird. Wenn keine anderen Bedienelemente lackiert werden müssen und sie nach dem DGV an die Reihe kommen, dann ist es gut sichtbar.

Was Sie sehen, ist die Form zuerst gezeichnet, mit Löchern, wo die Kontrollen gehen. Diese Löcher haben einen weißen Hintergrund. Schwarz, wenn Sie die TransparencyKey- oder die Opacity-Eigenschaft verwenden. Jedes Steuerelement erhält dann das Paint-Ereignis und die Lücken werden nacheinander gefüllt. Dieser Effekt wird vom Benutzer auch als Flimmern wahrgenommen, obwohl es sich um eine andere Art von Flimmern handelt, als bei DoubleBuffered. Es ist besonders auffällig, wenn der Hintergrund schwarz ist.

Um dieses Problem zu lösen, ist das gesamte Formular mit seinen Steuerelementen doppelt gepuffert. Das ist nicht in Windows Forms verfügbar. Windows XP und höher unterstützen dies jedoch tatsächlich. Überprüfen Sie this thread, um zu sehen, wie das gemacht wird. Beachten Sie, dass es Nebenwirkungen wie in diesem Thread dokumentiert haben kann.

+0

Interessant, obwohl im Fall der Datagridview, ohne Doppelbuffering, dauert es 2-3 Sekunden, um das Steuerelement neu zu zeichnen, aber mit Doppelpufferung, es scheint sofort – Karg

+0

BTW, up Abstimmung für die Antwort auf den geschützten Teil der Frage – Karg

+2

Eigentlich Doppelpufferung macht es deutlich schneller ... genug schneller, dass das bloße Auge den Unterschied leicht unterscheiden kann.Ich schätze diese Antwort darin, dass es die "richtigste" Sache zu tun ist, aber es ist nicht annähernd so praktisch wie nur die Verwendung von Reflektion, um die Einstellung auf dem DataGridView zu ändern. –

10

Ich denke, die beste Lösung:

typeof(DataGridView).InvokeMember(
    "DoubleBuffered", 
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, 
    null, 
    myDataGridViewObject, 
    new object[] { true }); 

here gefunden

+3

Die Frage lautet, warum es auf "false" gesetzt ist und nicht, wie es überschrieben werden soll. – Karg

+0

Obwohl dies hilfreich für jemanden sein kann, der nach dem Aktivieren des doppelten Puffers sucht. – Barshan

Verwandte Themen