web-dev-qa-db-fra.com

Quoi de mieux à utiliser: un DataGrid ou ListView pour afficher de grandes quantités de données?

Je souhaite afficher plus de 50000 lignes dans un tableau. Quel est le meilleur contrôle à utiliser: un DataGrid ou un ListView (vue de détail)? Lequel de ces contrôles aura la meilleure performance?

23
alex dee

Comme Hans le dit dans un commentaire sur la question initiale, ils auront tous les deux une performance catastrophique, surpassée uniquement par le mécontentement que vos utilisateurs ressentiront sûrement face à la folie de tant de lignes de données affichées en même temps.

Mais si cela est inévitable dans votre application (et que vous fournissez une très bonne fonction de recherche), vous devriez alors envisager fortement d'utiliser l'option mode virtuel , quel que soit le contrôle que vous décidez d'utiliser. . Cela signifie que vous devez fournir vos propres opérations de gestion des données, plutôt que de vous fier au contrôle pour le faire à votre place. L'avantage est que les choses vont beaucoup plus vite. Comme le documentation dit:

Le mode virtuel est conçu pour être utilisé avec de très grands magasins de données. Lorsque la propriété VirtualMode a la valeur true, vous créez une DataGridView avec un nombre défini de lignes et de colonnes, puis vous gérez l'événement CellValueNeeded pour remplir les cellules. Le mode virtuel nécessite la mise en œuvre d'un cache de données sous-jacent pour gérer la population, la modification et la suppression des cellules DataGridView en fonction des actions de l'utilisateur. Pour plus d'informations sur l'implémentation du mode virtuel, voir Comment: implémenter le mode virtuel dans le contrôle DataGridView Windows Forms .

Ou, pour le contrôle ListView :

La définition de la propriété VirtualMode sur true place la ListView en mode virtuel. En mode virtuel, la collection normale Items est inutilisée. Au lieu de cela, les objets ListViewItem sont créés dynamiquement selon que le ListView les requiert.

Le mode virtuel peut être utile dans de nombreuses circonstances. Si un objet ListView doit être rempli à partir d'une très grande collection déjà en mémoire, la création d'un objet ListViewItem pour chaque entrée peut être une perte de temps. En mode virtuel, seuls les éléments requis sont créés. Dans d'autres cas, il peut être nécessaire de recalculer fréquemment les valeurs des objets ListViewItem, ce qui produirait des performances inacceptables. En mode virtuel, seuls les éléments requis sont calculés.

Pour utiliser le mode virtuel, vous devez gérer l'événement RetrieveVirtualItem , qui est déclenché à chaque fois que ListView nécessite un élément. Ce gestionnaire d'événements doit créer l'objet ListViewItem qui appartient à l'index spécifié. De plus, la propriété VirtualListSize doit être définie sur la taille de la liste virtuelle.

La gestion de l'événement SearchForVirtualItem permet d'effectuer une recherche en mode virtuel. Si cet événement n'est pas géré, les méthodes FindItemWithText et FindNearestItem renverront null.

Vous pouvez gérer l'événement CacheVirtualItems afin de conserver un cache d'objets ListViewItem. Si le calcul ou la recherche permettant de créer un objet ListViewItem est coûteux, la maintenance d'un cache peut améliorer les performances.

Si la propriété View est définie sur Mosaïque, la valeur passe automatiquement à LargeIcon lorsque VirtualMode est défini sur true.

En mode virtuel, la collection Items est désactivée. Tenter d'y accéder aboutit à InvalidOperationException . Il en va de même pour la collection CheckedItems et la collection SelectedItems . Si vous souhaitez récupérer les éléments sélectionnés ou cochés, utilisez plutôt les collections SelectedIndices et CheckedIndices .

28
Cody Gray

Utilisez une FastObjectListView à partir de ObjectListView project. 

50 000 lignes, c'est rien, avec le tri automatique, le filtrage, la recherche par typage et plein d'autres avantages :)

13
Grammarian

Ne pas Si vous voulez faire quelque chose comme cela, chargez les 500 premières lignes et les 100 dernières. Lorsque l'utilisateur fait défiler une centaine de lignes, charge automatiquement le prochain lot. Sous Ctrl + Fin, affichez les 100 derniers et préchargez le lot précédent au cas où l'utilisateur ferait défiler l'écran.

Jouez avec les chiffres jusqu'à ce que vous obteniez quelque chose de lisse pour l'utilisateur sans avoir à charger 50 000 lignes

0
Sylverdrag