J'ai déjà résolu ce problème, mais je le poste pour la postérité.
J'ai rencontré un problème très étrange avec le DataGridView sur mon système à double moniteur. Le problème se manifeste par un repeint EXTRÊMEMENT lent du contrôle ( comme 30 secondes pour une peinture complète ), mais seulement lorsqu'il est sur l'un de mes écrans. Quand il est sur l'autre, la vitesse de repeinte est bonne.
J'ai une Nvidia 8800 GT avec les derniers pilotes non-beta (175. quelque chose). S'agit-il d'un bug du pilote ? Je laisse la question en suspens, puisque je dois vivre avec cette configuration particulière. (Cela ne se produit pas sur les cartes ATI, cependant...)
La vitesse de peinture n'a rien à voir avec le contenu des cellules, et le dessin personnalisé n'améliore pas du tout les performances, même lorsqu'il s'agit de peindre un rectangle plein.
Je découvre par la suite que le fait de placer un ElementHost (de l'espace de noms System.Windows.Forms.Integration) sur le formulaire corrige le problème. Il n'est pas nécessaire de le manipuler ; il suffit qu'il soit un enfant du formulaire sur lequel se trouve également le DataGridView. Il peut être redimensionné à (0, 0) tant que l'élément Visible est vrai.
Je ne veux pas ajouter explicitement la dépendance .NET 3/3.5 à mon application ; je crée une méthode pour créer ce contrôle au moment de l'exécution (s'il le peut) en utilisant la réflexion. Cela fonctionne, et au moins cela échoue gracieusement sur les machines qui n'ont pas la bibliothèque requise - cela redevient juste lent.
Cette méthode me permet également d'appliquer le correctif pendant que l'application est en cours d'exécution, ce qui permet de voir plus facilement ce que les bibliothèques WPF modifient sur mon formulaire (à l'aide de Spy++).
Après de nombreux essais et erreurs, j'ai remarqué que l'activation de la double mise en mémoire tampon sur le contrôle lui-même (par opposition au formulaire) corrige le problème !
Il vous suffit donc de créer une classe personnalisée basée sur DataGridView pour pouvoir activer son DoubleBuffering. Voilà, c'est fait !
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Tant que toutes mes instances de la grille utilisent cette version personnalisée, tout va bien. Si jamais je me retrouve dans une situation où je ne peux pas utiliser la solution de la sous-classe (si je n'ai pas le code), je suppose que je pourrais essayer d'injecter ce contrôle dans le formulaire :) ( bien que je serai plus enclin à essayer d'utiliser la réflexion pour forcer la propriété DoubleBuffered de l'extérieur afin d'éviter une fois de plus la dépendance ).
C'est triste qu'une chose aussi trivialement simple ait pris autant de temps...
1 votes
Nous avons eu un problème similaire avec des clients qui ont Multimon installé. Pour une raison quelconque, quand ils désactivent Multimon, le problème disparaît.
0 votes
Quelqu'un est-il au courant et peut-il expliquer pourquoi cela se produit et pourquoi DoubleBuffered ne peut être activé par défaut ?