head.WriteLine()

Dienstag, April 25, 2006

ListView im Virtual Mode

In .NET 2.0 wurde das ListView-Control um den so genannten "Virtual Mode" erweitert. In diesem werden die anzuzeigenden Elemente erst erzeugt, wenn sie im Darstellungsbereich erscheinen.

Dies ist immer dann sinnvoll, wenn Sie große Datenmengen in einer Liste anzeigen wollen. Normalerweise würden Sie alle Daten beim Öffnen der Form in die Liste einfügen. Wenn diese aus einer Datenbank kommen, kann es hierbei zu recht unschönen Verzögerungen kommen. Zudem belegen die Daten Speicher, da das ListView-Control diese zwischenspeichert. Aber auch bei der Anzeige unterschiedlicher Elementsymbole kann es zu Zeit- und Ressourcen-Engpässen kommen. Der Windows Explorer nutzt den Virtual Mode beispielsweise, um die Datei- und Verzeichnissymbole dynamisch nachzuladen.

Im Virtual Mode legt das Control einen Cache virtueller Elemente an und synchronisiert diese mit Größe und Position der Scrollbar. Die Aktivierung erfolgt über das Setzen der VirtualMode-Eigenschaft auf true. Die Anzahl der Elemente kann hierbei über die VirtualListSize-Eigenschaft angegeben werden. Wenn sich ein Element im Anzeigebereich befindet, wird das RetrieveVirtualItem-Event ausgelöst, in dem das entsprechende Element erzeugt und mit Daten gefüllt werden kann. Um welches Element es sich hierbei handelt, wird über die ItemIndex-Eigenschaft der RetrieveVirtualItemEventArgs-Klasse signalisiert.

Das folgende Beispiel legt eine virtuelle Liste mit 50 Einträgen an und erzeugt dynamisch Elemente, die den jeweiligen Index als Text anzeigen.

ListView listView1 = new System.Windows.Forms.ListView();
listView1.VirtualMode = true;
listView1.VirtualListSize = 50;
listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
...

private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = new ListViewItem(e.ItemIndex.ToString());
}