Ich habe das tatsächlich gelöst, aber ich poste es für die Nachwelt.
Ich hatte ein sehr merkwürdiges Problem mit DataGridView auf meinem Dual-Monitor-System. Das Problem äußert sich in einem EXTREM langsamen Repaint des Steuerelements ( wie 30 Sekunden für ein vollständiges Repaint ), jedoch nur, wenn es sich auf einem meiner Bildschirme befindet. Auf der anderen Seite ist die Repaint-Geschwindigkeit in Ordnung.
Ich habe einen Nvidia 8800 GT mit den neuesten Nicht-Beta-Treibern (175. etwas). Ist es ein Treiberfehler? Ich werde das in der Luft lassen, da ich mit dieser speziellen Konfiguration leben muss. (Bei ATI-Karten ist dies jedoch nicht der Fall ...)
Die Malgeschwindigkeit hat nichts mit dem Zelleninhalt zu tun, und das benutzerdefinierte Zeichnen verbessert die Leistung überhaupt nicht - selbst wenn nur ein festes Rechteck gemalt wird.
Ich finde später heraus, dass das Platzieren eines ElementHost (aus dem System.Windows.Forms.Integration-Namespace) im Formular das Problem behebt. Es muss nicht durcheinander gebracht werden; Es muss nur ein untergeordnetes Element der Form sein, in der sich auch DataGridView befindet. Die Größe kann auf (0, 0) geändert werden, solange die Visible- Eigenschaft wahr ist.
Ich möchte meiner Anwendung die .NET 3 / 3.5-Abhängigkeit nicht explizit hinzufügen. Ich mache eine Methode, um dieses Steuerelement zur Laufzeit (wenn es kann) unter Verwendung von Reflektion zu erstellen. Es funktioniert, und zumindest schlägt es auf Computern, die nicht über die erforderliche Bibliothek verfügen, ordnungsgemäß fehl - es wird einfach wieder langsam.
Mit dieser Methode kann ich auch Korrekturen anwenden, während die App ausgeführt wird, sodass ich leichter sehen kann, was die WPF-Bibliotheken in meinem Formular ändern (mit Spy ++).
Nach vielen Versuchen und Irrtümern stelle ich fest, dass das Aktivieren der doppelten Pufferung auf dem Steuerelement selbst (im Gegensatz zum Formular) das Problem behebt!
Sie müssen also nur eine benutzerdefinierte Klasse erstellen, die auf DataGridView basiert, damit Sie deren DoubleBuffering aktivieren können. Das ist es!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Solange alle meine Instanzen des Rasters diese benutzerdefinierte Version verwenden, ist alles in Ordnung. Wenn ich jemals auf eine dadurch verursachte Situation stoße, in der ich die Unterklassenlösung nicht verwenden kann (wenn ich den Code nicht habe), könnte ich versuchen, dieses Steuerelement in das Formular einzufügen :) ( obwohl ich ' Es ist wahrscheinlicher, dass Sie versuchen, die DoubleBuffered-Eigenschaft mithilfe von Reflection von außen zu aktivieren, um die Abhängigkeit erneut zu vermeiden .
Es ist traurig, dass so eine trivial einfache Sache so viel Zeit in Anspruch genommen hat ...