[.net 2] listview en mode virtuel

Soyez le premier à donner votre avis sur cette source.

Vue 18 733 fois - Téléchargée 937 fois

Description

Pour répondre à une question posée sur le ng microsoft.public.fr.dotnet.csharp, voici comment utiliser le listview du framework 2.0 en mode virtuel :

- mettre true à la propriété VirtualMode
- Donner le nombre total d'élément du listview dans la propriété : VirtualListSize
- S'abonner à l'évènement RetrieveVirtualItem et lui donner l'item qu'il demande.

EDIT :
Comme le faisait remarquer TheSaib, je n'ai pas expliqué ce qu'est le mode virtuel du listview... alors explications :

En mode normal, lorsque vous utilisez un ListView, vous ajoutez des éléments en appelant la méthode .Add (ou .AddRange) de la propriété Items, vous remplissez donc "physiquement" sa collection. Cette solution est fort apréciable la plupart du temps... environ 100 items.
Malheureusement, lorsque le nombre d'élément grandi, la ListView s'alourdit et entraine l'application dans sa chute, imaginez la place que prend 100 éléments en mémoire comparée à 1.000 voire 10.000 !
Pour contourner cette faiblesse, il est possible d'utiliser le mode virtuel, ce dernier travail différement... vous ne remplissez plus la collection manuellement, mais vous "donnez" au système les éléments qu'il vous demande lors de l'appel de l'évènement RetrieveVirtualItem.

J'espère que l'explication est suffisament clair :)

Source / Exemple :


public partial class Form1 : Form
    {
        private List<Personne> personnes;
        public Form1()
        {
            InitializeComponent();

            // Initialisation de la collection personnes
            // avec 10.000 items
            personnes = new List<Personne>();
            for (int i = 0; i < 10000; i++)
            {
                personnes.Add(new Personne("Nom" + i.ToString(), "Prenom" + i.ToString()));
            }

            // Initialisation du listview pour 
            // qu'il utilise le mode virtuel
            listView1.VirtualMode = true;
            listView1.VirtualListSize = personnes.Count; // nombre d'items du listview (donc ici 10.000)
            listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);

        }

        public void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            // ici l'évènement nous demande l'élément dont l'id sera : e.ItemIndex
            ListViewItem item;
            item = new ListViewItem(personnes[e.ItemIndex].Nom);
            item.SubItems.Add(personnes[e.ItemIndex].Prenom);

            // on le retourne dans e.Item
            e.Item = item;

            Console.WriteLine("Chargement de l'item n°{0}, {1} {2}",
                e.ItemIndex, personnes[e.ItemIndex].Nom, personnes[e.ItemIndex].Prenom);
        }
    }

Codes Sources

A voir également

Ajouter un commentaire Commentaires
LTourist
Messages postés
24
Date d'inscription
jeudi 22 décembre 2005
Statut
Membre
Dernière intervention
8 février 2009

1 juil. 2006 à 14:05
Merci beaucoup, c'est tout ce dont j'avais besoin!! :D Au passage je remarque que je ne t'avais pas vraiment remercier pour cette source... Merci donc pour cette source simple, clair et précise et rendant cependant bien service :) Je ne la noterais par contre certainement pas car je travaille sous vb.net, non sous C#, et n'ayant pas celui-ci je ne vais pas juste noter ce petit bout de code disponible sur cette page, ce ne serait pas tres juste compte tenu du reste...
Enfin si j'avais eu noter, j'aurais certainement mis dans les 8/9 :D

Merci encore :D
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
1 juil. 2006 à 13:07
en fait... c'est vrai que ce n'est pas très clair...
il faut maintenant ta propre collection d'item sélectionné en procédant ainsi :

List<ListItem> selectedItems = new List<ListItem>();

protected void ListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {

if (e.IsSelected) {
selectedItems.Add(e.Item);
} else {
selectedItems.Remove(e.Item);
}

}

/* A tester */
LTourist
Messages postés
24
Date d'inscription
jeudi 22 décembre 2005
Statut
Membre
Dernière intervention
8 février 2009

1 juil. 2006 à 12:09
Ah oui pas bête je n'avais pas pensé à ça ^^ Pour l'afficahe tout fonctionne, par contre, on ne peut pas récupérer l'index de l'élément sélectionné, ou l'objet Item sélectionné par l'utilisateur?
En fait j'utilise une listview pour faire un visualiseur de log, chaque log correpondant à un objet avec ses propriétés... Mon application étant prévu pour fonctionner sur de longue session, le mode virtuel minteresse tout particulierement. Seulement je voudrais que lorsque l'utilisateur double-clique sur un Item de la ListView, l'application affiche les détails du log. Pour cela il me faudrait l'index de l'item sélectionné, et je ne trouve pas comment faire malheureusement... Pourrais-tu m'aider?
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
1 juil. 2006 à 11:41
au niveau affichage, c'est beaucoup plus rapide.

et surtout, tu ne charges en mémoire qu'une seule collection, et pas ta collection de ListItem et ta collection d'objet (ou DataTable...)
LTourist
Messages postés
24
Date d'inscription
jeudi 22 décembre 2005
Statut
Membre
Dernière intervention
8 février 2009

1 juil. 2006 à 10:05
Je déterre un peu la source, mais j'aimerais comprendre au niveau mémoire la différence entre stocker 10 000 item de listview, et stocker 10 000 item de personne.... En quoi ça ne revient pas au meme? La quantité d'info a mémoriser n'est elle pas toujours la même? Ou alors est ce que ça vient du fait que les éléments sont "affichés" dans la listView?

Merci

LTourist
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.