[.net 2] listview en mode virtuel

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

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.