VB.NET-Tipp 0069: Der VirtualMode des ListView-Controls
von Daniel Noll
Beschreibung
Seit der Version 2.0 des .NET-Frameworks existiert eine weitere Möglichkeit Einträge zu einem ListView hinzuzufügen: der VirtualMode. Ist dieser virtuelle Modus angeschaltet, so muss man nicht sämtliche Daten von vornherein der Items-Eigenschaft des ListView-Steuerelements hinzufügen, sondern das ListView holt sich die Daten nach Bedarf über das Ereignis RetrieveVirtualItem ab. Geht es darum eine große Anzahl an Elementen anzuzeigen, so kann man auf diese Art und Weise die lange Verzögerung, die beim Einfügen der ListViewItems entsteht, vermeiden.
Dieser Tipp demonstriert an einer sehr einfachen Anwendung, wie der virtuelle Modus des ListViews verwendet werden kann.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2005 ' ' Referenzen: ' - System ' - System.Data ' - System.Deployment ' - System.Drawing ' - System.Windows.Forms ' - System.Xml ' ' Imports: ' - Microsoft.VisualBasic ' - System ' - System.Collections ' - System.Collections.Generic ' - System.Data ' - System.Drawing ' - System.Diagnostics ' - System.Windows.Forms ' ' ############################################################################## ' ################################# Form1.vb ################################### ' ############################################################################## Option Strict On Public Class Form1 Private Structure Zahlen Public Zahl As Integer Public Wurzel As Double Public Log10 As Double Public Sub New(ByVal Zahl As Integer) Me.Zahl = Zahl Me.Wurzel = Math.Sqrt(Zahl) Me.Log10 = Math.Log10(Zahl) End Sub End Structure Private EinPaarZahlen As New List(Of Zahlen) Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Generiert ein paar Zahlen, welche im ListView-Control angezeigt werden For i As Integer = 1 To 1000000 EinPaarZahlen.Add(New Zahlen(i)) Next i End Sub ''' <summary> ''' Aktiviert den virtuellen Modues des ListView-Controls ''' </summary> ''' <remarks></remarks> Private Sub btnHinzufuegenVirtuell_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnHinzufuegenVirtuell.Click ' Virtual-Mode anschalten ' Vor diesem Schritt ist es wichtig, dass das ListView keine "per Hand" ' hinzugefügten Elemente enthält, ansonsten erhält man eine ' Exception lsvBeispiel.VirtualMode = True ' Das ListView erwartet in der Eigenschaft VirtualListSize die Anzahl ' der Elemente, die es anzeigen soll lsvBeispiel.VirtualListSize = EinPaarZahlen.Count btnHinzufuegenNormal.Enabled = False btnHinzufuegenVirtuell.Enabled = False End Sub ''' <summary> ''' Fügt die Elemente auf "normale" Art- und Weise in das ''' ListView ein. ''' </summary> ''' <remarks>Braucht eine halbe Ewigkeit...</remarks> Private Sub btnHinzufuegenNormal_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnHinzufuegenNormal.Click Me.Cursor = Cursors.WaitCursor ' Verhindert, dass das Control sich während dem Hinzufügen der Einträge ' immer wieder neu zeichnet lsvBeispiel.BeginUpdate() For Each Zahl As Zahlen In EinPaarZahlen lsvBeispiel.Items.Add(New ListViewItem( _ New String() { _ Zahl.Zahl.ToString("########0.####"), _ Zahl.Wurzel.ToString("########0.####"), _ Zahl.Log10.ToString("########0.####")})) Next lsvBeispiel.EndUpdate() btnHinzufuegenNormal.Enabled = False btnHinzufuegenVirtuell.Enabled = False Me.Cursor = Cursors.Default End Sub Private Sub btnListeLeeren_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnListeLeeren.Click ' Auch das Entfernen einer großen Menge "normaler" Einträge ' kostet eine Menge Zeit Me.Cursor = Cursors.WaitCursor lsvBeispiel.Items.Clear() Me.Cursor = Cursors.Default ' VirtualMode ausschalten lsvBeispiel.VirtualListSize = 0 lsvBeispiel.VirtualMode = False btnHinzufuegenNormal.Enabled = True btnHinzufuegenVirtuell.Enabled = True End Sub ''' <summary> ''' Wird aufgerufen, wenn das ListView den Eintrag mit dem Index ''' e.ItemIndex benötigt ''' </summary> Private Sub lsvBeispiel_RetrieveVirtualItem(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.RetrieveVirtualItemEventArgs) _ Handles lsvBeispiel.RetrieveVirtualItem ' Holt die Zahl aus unserer Liste, die das ListView-Control benötigt. Dim Zahl As Zahlen = EinPaarZahlen(e.ItemIndex) Dim lviZahl As New ListViewItem( _ New String() { _ Zahl.Zahl.ToString("########0.####"), _ Zahl.Wurzel.ToString("########0.####"), _ Zahl.Log10.ToString("########0.####")}) ' Das ListView-Control erwartet wenn das Ereignis abgearbeitet ist in ' e.Item das ListViewItem, welches es angefordert hat e.Item = lviZahl End Sub End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 1 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Kriechi am 12.05.2008 um 09:49
Virtualmode hat allerdings einige Einschränkungen...
http://blogs.msdn.com/cumgranosalis/archive/2006/03/06/VirtualListViewUsage.aspx
Icons lassen sich nicht so einfach einstellen
Gruppen funktionieren nicht
keine Sortierung möglich
...