2008-12-03 11 views
4

Je souhaite afficher les enregistrements de notre base de données dans une liste - mais les recherches peuvent prendre beaucoup de temps. Je peux utiliser RetrieveVirtualItem pour me dire quand un nouveau ListViewItem est nécessaire, ajouter un élément factice, et démarrer une extraction; mais qu'est-ce que je fais avec l'enregistrement quand la base de données le renvoie? Je ne peux pas mettre à jour la collection d'éléments ListView alors que ListView est en mode virtuel. Existe-t-il un moyen d'indiquer à ListView de recharger un élément? Ou est-ce que je peux juste garder une référence à ListViewItem et peupler cela? Si aucun de ces deux ne fonctionne, comment pourrais-je peupler un ListView en mode virtuel de manière asynchrone? Votre gestionnaire RetrieveVirtualItem sera appelé lorsque la ListView doit être mise à jour.Comment peupler un ListView en mode virtuel de manière asynchrone?

Répondre

9

Si vos données ne sont pas encore disponibles et que vous ne pouvez pas attendre, vous devrez créer un élément factice (ne pas gérer RetrieveVirtualItem déclenchera une exception).

Une fois que vos données sont prêtes, vous pouvez invalider le contrôle - cela rappellera RetrieveVirtualItem pour chacun des éléments visibles. Comme alternative à invalider le contrôle tout, vous pouvez contrôler les éléments doivent être redessinés en utilisant la méthode RedrawItems du contrôle ListView, qui fonctionne dans les modes virtuels et réguliers:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.redrawitems.aspx

On dirait qu'il peut être utile de télécharger vos dossiers par lots si cela doit prendre un certain temps. De plus, si vos opérations de base de données sont chers, il vaut bien étudier la mise en cache vos ListItems (il y a un événement CacheVirtualItems vous devrez gérer):

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.cachevirtualitems.aspx

J'espère que cela aide.

Questions connexes