Filtrage d'une DataGridView qui n'a pas de liaison de données
J'ai un non lié aux données DGV (pas de source de données, etc; les lignes ajoutées manuellement). Pour le filtre j'avais été faire un contrôle en boucle et en définissant les lignes de la propriété visible de façon appropriée. Cela a bien fonctionné avec de plus petits ensembles de tests, mais il échoue dans la performance avec les plus grands. 1k lignes filtrées à 5000/sec. 10k lignes filtrées à seulement ~250/sec. 50k, à seulement 40/sec. Mon hypothèse sur ce qui se passe, c'est que chaque fois que je change une des lignes de visibilité, la DGV reconstruit une liste de lignes affichées en tournant le processus de filtrage en O(n^2) opération.
Tout en même 10k lignes indique que l'utilisateur est d'abuser du système; mal comportés les utilisateurs doivent être pris en compte donc j'ai besoin de faire quelque chose de différent. Est-il un moyen plus rapide pour filtrer un grand nombre de lignes que ce que je fais aujourd'hui sans l'aide de la liaison de données, ou dois-je me rabattre sur la manière d'effacer/recréer toutes les lignes (pour des quantités raisonnables de données, ce qui est nettement plus lent)?
//psuedocode. s'exécute lentement si plus de quelques milliers de lignes. foreach (DataGridViewRow ligne dans myDGV) { ligne.Visible = CalculateFilter(ligne); }
- Pourquoi les lignes doivent être générés manuellement? Il y a peut être pas de bon ou de réponse rapide si ce un profonds problème d'architecture.
- Il n'y a pas une base de données pour fournir une source de données. Les données backend utilise la sérialisation xml pour stocker les enregistrements de données dans "pseudotable" fichiers et passe à l'affichage des valeurs (combiné à partir de plusieurs fichiers) comme une Liste<> des structures contenant chacun l'une des données pour un seul DGV ligne.
- Merci pour ça. Je ne serais probablement pas être conscient de ce que jusqu'à ce qu'il soit trop tard.
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème il y a quelques années (avant que je savais à propos de databindings) et a trouvé un bug poste chez Microsoft, en disant que c'est confirmé, mais la question ne sera probablement pas être fixe.
Cependant, il existe quelques possibilités de résoudre ce problème.
Insted d'ajouter des lignes à la datagridview, ajouter des lignes à une table et le lier à la datagridview.
Créer une Classe qui hérite de BindingList et met en œuvre IBindingList. Puis le lier à votre DataGridView.
Ensemble DataGridView VirtualMode de vrai.
La deuxième méthode est plus compliquée, parce que vous devez ajouter votre propre logique à mettre en œuvre les FindCore Méthode.
Et vous devriez regarder ici: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/68c8b93e-d273-4289-b2b0-0e9ea644623a
La performance globale devrait grandement améliorer si vous supprimez temporairement les lignes de la dataGridView, alors que le filtrage.
Copiez et collez ce code (n'oubliez pas d'ajouter des gestionnaires d'événements pour les événements de bouton)
dataGridView.SuspendLayout();
avant les modifications etdataGridView.ResumeLayout(true);
serait probablement avoir le même effet (j'aime bien l'envelopper de ce genre de code dans unx.SuspendLayout(); try { ... } finally { x.ResumeLayout(); }
bloc, sinon votre dataGridView ne sera pas de mise à jour de l'interface utilisateur plus si quelque chose se trompe jamais.