Mit dem ListView lassen sich auf einfache weise Listen darstellen. Gerne wird dieses Control auch für den Nachbau einer Explorerfunktionalität verwendet. Zum Auswerten der angezeigten Liste verwendet der Benutzer unter anderem die Möglichkeit, die Einträge zu sortieren (z.B. nach Name, Datum ect.) Wie man dem Benutzer die Möglichkeit gibt, seine Dateien im ListView zu sortieren, zeigt das nachfolgende Beispiel. Das ListView besitzt die Eigenschaft "Sorting". Lautet diese "Ascending" oder "Decending" (Auf- bzw. Absteigend), so werden die hinzugefügten ListViewItems entsprechend sortiert im ListView eingefügt. In diesem Zustand werden aber die Einträge nur nach der ersten Spalte namentlich sortiert! Möchte man die Einträge nach den Inhalten weiterer Spalten sortieren, so muss ein Objekt mit einer imlementierenten ICompare Schnittstelle der ListViewItemSorter Eigenschaft übergeben werden. Es sei hier angemerkt, dass man beim Hinzufügen von weiteren ListViewItems die Sortierung aus Performancegründen deaktivieren sollte, und diese dann abschließend manuell mit der Sort-Methode auszuführen. In dem nun nachfolgendem Beispiel bauen wir einen kleinen Explorer nach, dessen Einträge nach Name, Größe und dem letzten Schreibzugriff sortiert werden können. Ein Auslösen der Sortierung erfolgt über das Anklicken der Columnheader. Den Klassen "SortByDate" und "SortBySize" wird die ICompare-Schnittstelle zugewiesen. Diese Klassen bestimmen die Sortierung. Für dieses Beispiel lesen wie alle Dateien aus dem Verzeichnis C:\Windows ein. Imports System.IO Public Class Form1 ' Sortierreihenfolge (man kann natürlich hier auch seine ' eigene Sortierdefnition verwenden) Private m_Sort As SortOrder = SortOrder.Descending Private WithEvents m_ltv As New ListView Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Formular anpassen Me.Width = 668 Me.Height = 571 ' ListView anpassen und 3 Columns hinzufügen With m_ltv .Width = 627 .Height = 482 .Dock = DockStyle.Fill .View = View.Details .Columns.Add("Name", 300, HorizontalAlignment.Left) .Columns.Add("Größe", 100, HorizontalAlignment.Left) .Columns.Add("Geändert am", 150, HorizontalAlignment.Left) End With ' Listview dem Formular hinzufügen Me.Controls.Add(m_ltv) ' Dateien in das Listview einlesen Call LoadFiles() End Sub Private Sub LoadFiles() Dim l As ListViewItem For Each f As FileInfo In New DirectoryInfo("C:\Windows").GetFiles l = m_ltv.Items.Add(f.Name) l.SubItems.Add(f.Length.ToString) l.SubItems.Add(f.LastWriteTime) l.Tag = f ' Wird später für die Sortierung benötigt Next End Sub Private Sub m_ltv_ColumnClick(ByVal sender As Object, _ ByVal e As System.Windows.Forms.ColumnClickEventArgs) _ Handles m_ltv.ColumnClick Select Case e.Column ' Nach Namen sortieren Case 0 ' Die erste Spalte beinhaltet bereits eine ' "namentliche" Sortierung m_ltv.ListViewItemSorter = Nothing m_ltv.Sorting = m_Sort ' Nach der Größe sortieren Case 1 m_ltv.ListViewItemSorter = New SortBySize(m_Sort) ' Nach dem letztel Schreibzugriff sortieren Case 2 m_ltv.ListViewItemSorter = New SortByDate(m_Sort) End Select ' Sortierreihenfolge umkehren If m_Sort = SortOrder.Ascending Then m_Sort = SortOrder.Descending ElseIf m_Sort = SortOrder.Descending Then m_Sort = SortOrder.Ascending End If End Sub Public Class SortBySize Implements IComparer Private m_Sort As SortOrder = SortOrder.None Public Sub New(ByVal Sort As SortOrder) m_Sort = Sort ' Sortierreihenfolge End Sub Public Function Compare(ByVal x As Object, ByVal y As Object) _ As Integer Implements System.Collections.IComparer.Compare ' Die in der Signatur angegebene Objekte x und y sind ListviewItems!! Dim lx As ListViewItem = CType(x, ListViewItem) Dim ly As ListViewItem = CType(y, ListViewItem) Dim x_size As Long = CType(lx.Tag, FileInfo).Length Dim y_size As Long = CType(ly.Tag, FileInfo).Length ' An dieser Stelle wird die Reihenfolge entschieden If m_Sort = SortOrder.Ascending Then Return x_size.CompareTo(y_size) Else Return -x_size.CompareTo(y_size) End If End Function End Class Public Class SortByDate Implements IComparer Private m_Sort As SortOrder = SortOrder.None Public Sub New(ByVal Sort As SortOrder) m_Sort = Sort ' Sortierreihenfolge End Sub Public Function Compare(ByVal x As Object, ByVal y As Object) _ As Integer Implements System.Collections.IComparer.Compare ' Die in der Signatur angegebene Objekte x und y sind ListviewItems!! Dim lx As ListViewItem = CType(x, ListViewItem) Dim ly As ListViewItem = CType(y, ListViewItem) Dim x_date As Date = CType(lx.Tag, FileInfo).LastWriteTime Dim y_date As Date = CType(ly.Tag, FileInfo).LastWriteTime ' An dieser Stelle wird die Reihenfolge entschieden If m_Sort = SortOrder.Ascending Then Return x_date.CompareTo(y_date) Else Return -x_date.CompareTo(y_date) End If End Function End Class End Class Dieser Tipp wurde bereits 30.670 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. Neu! sevCoolbar 3.0 Professionelle Toolbars im modernen Design! Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |