Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0069: Der VirtualMode des ListView-Controls

 von 

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:

Schwierigkeitsgrad 1

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:

Download des Beispielprojektes [11,72 KB]

' 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
...