vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · ListView & TreeView   |   VB-Versionen: VB.NET26.09.07
ListView-Einträge nach Spalteninhalte sortieren (.NET)

Mit dem ListView lassen sich auf einfache weise Listen darstellen. Wie man dem Benutzer die Möglichkeit gibt, seine Dateien im ListView zu sortieren, zeigt das nachfolgende Beispiel.

Autor:   Lars KonschakBewertung:     [ Jetzt bewerten ]Views:  30.098 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

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.098 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel