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.
InformationsquelleAutor Dan Neely | 2009-08-10