Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0534: Listview nach Datum und Zahlen sortieren

 von 

Beschreibung 

Ein ListView kann über die Zuweisung von Sortspalte, SortOrder und Sorted=True normalerweise bequem sortiert werden. Probleme gibt es erst, wenn Spalten mit Datum oder Spalten mit numerischen Werten sortiert werden sollen, da im ListView eigentlich nur Text dargestellt wird. Ein Datum in europäischer Schreibweise ist aber nicht sortierbar und bei Zahlen wird nicht die Größe bewertet, sondern es geht nach dem Wert der ersten Ziffer, dann dem Wert der 2. Ziffer etc.

Update von Jochen Wierum nach einem unbekannten Kommentar am 24. Februar 2004:
Ein Fehler in den Indizes wurde behoben; nun werden die Daten richtig sortiert.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [3,21 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!

'--- Anfang Projektdatei Listview nach Datum und Zahlen sortieren.vbp ---
' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MSCOMCTL.OCX)' wird benötigt.

'--- Anfang Formular "Form1" alias ListviewSortierennachdatumundzahl.frm  ---
' Steuerelement: Listenanzeigesteuerungselement "ListView1"
'
'Autor: Peter K. Sauer       peter.k.sauer@web.de
'
' ListView nach Datum und Zahlwerten sortieren
' Ein ListView kann über die Zuweisung von Sortspalte, SortOrder und
' Sorted=True normalerweise bequem sortiert werden. Probleme gibt es
' erst, wenn Spalten mit Datum oder Spalten mit numerischen Werten
' sortiert werden sollen, da im ListView eigentlich nur Text darge-
' stellt wird.
' Ein Datum in europäischer Schreibweise ist aber nicht sortierbar
' und bei Zahlen wird nicht die Grösse bewertet sondern es geht nach
' dem Wert der ersten Ziffer, dann dem Wert der 2. Ziffer etc

Option Explicit

Private Sub Form_Load()
    Randomize            '-Zufallszahlen neu mischen
    Dim werte As Integer '-Zufallszahl als Ganzzahlvariable
    Dim Datums As String
    Dim Temp As Integer
    Dim i As Integer
    
    ListView1.View = lvwReport
    ListView1.ColumnHeaders.Add , , "Eintrag", 2000
    ListView1.ColumnHeaders.Add , , "Wert", 1000
    ListView1.ColumnHeaders.Add , , "Datum", 1500
    
    
    For i = 1 To 50
        ' Zufallszahl zuweisen
        werte = Rnd * 30000
        
        ' Erstellen eines Zufallsdatums
        ' mit dem Format
        ' //yyyy.mm.dd
        ' dd.mm.yyyy
        Temp = Rnd * 30 + 1
        Datums = Format(Temp, "00")
        Temp = Rnd * 11 + 1
        Datums = Datums & "." & Format(Temp, "00")
        Temp = Rnd * 60 + 1950
        Datums = Datums & "." & Format(Temp, "0000")
        
        ListView1.ListItems.Add i, , i
        ListView1.ListItems(i).ListSubItems.Add , , werte
        ListView1.ListItems(i).ListSubItems.Add , , Datums
    Next i
End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
    ' Bei dem nachstehenden Trick wird eine Dummy-Spalte
    ' in das ListView eingefügt und vor dem Sort mit einem
    ' sortierbaren Datum (yyyy.mm.dd) bzw. Zahl(String mit
    ' vorlaufenden Spaces) gefüllt. Nach der Sortierung
    ' wird die Dummy-Spalte wieder eleminiert.
    
    Dim NewSub As Long
    Dim i As Long
    Dim sFormat As String
    Dim Li As ListItem
    
    sFormat = "yyyy.mm.dd hh:mm:ss"
   
    With ListView1
        'ListView ruhig halten, Sichtbarkeit bleibt trotzdem erhalten
        .Visible = False
        
        'zu sortierende Spalte bestimmen
        .SortKey = ColumnHeader.Index - 1
        
        'Dummy-Spalte einfügen mit Breite 0
        .ColumnHeaders.Add , , "Dummy", 0
        
        'Nummer der Dummy-Spalte
        NewSub = .ColumnHeaders.Count - 1
        
        'abfragen auf Spalte mit Datum
        If ColumnHeader.Index = 3 Then
            'Sortiere nach Datum
            For i = .ListItems.Count To 1 Step -1
                Set Li = .ListItems(i)
                
                'Dummy-Spalte mit sortierfähigem Datum belegen
                Li.SubItems(NewSub) = Format(CDate(Li.SubItems(2)), sFormat)
            Next i
            
            'zu sortierende Spalte umbiegen
            .SortKey = NewSub
        
        'abfragen auf Spalte mit Zahlen
        ElseIf ColumnHeader.Index = 2 Then
            
            'Sortiere nach Zahlen
            For i = .ListItems.Count To 1 Step -1
                Set Li = .ListItems(i)
                
                'Dummy-Spalte mit sortierfähiger Zahl belegen
                Li.SubItems(NewSub) = Right(Space(20) & Li.SubItems(1), 20)
            Next i
            
            'zu sortierende Spalte umbiegen
            .SortKey = NewSub
        End If
        
        'SortOrder bestimmen Asc oder Desc
        .SortOrder = lvwAscending
            
        'Sort anstossen
        .Sorted = True
      
        'Dummy-Spalte entfernen
        .ColumnHeaders.Remove .ColumnHeaders.Count
        
        'Zeiger auf 1. Zeile und scrollen
        .ListItems(1).Selected = True
        .ListItems(1).EnsureVisible
            
        'sichtbar machen
        .Visible = True
    End With
End Sub
'--- Ende Formular "Form1" alias ListviewSortierennachdatumundzahl.frm  ---
'--- Ende Projektdatei Listview nach Datum und Zahlen sortieren.vbp ---

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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 5 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 Xander am 23.02.2005 um 15:30

Habe keine Frage zur Sortierung ansich, aber normalerweise kann doch die Sortierreihenfolge einer Spalte im entsprechenden ColumnHeader durch einen Pfeil angezeigt werden, oder? Zumindest habe ich das schon oft gesehen.

Wie geht das???

Kommentar von Carsten Albrecht am 31.01.2005 um 04:11

Ist kein Wunder, daß der Code nicht hundertpro funzt, da er einen bösen Haken hat - er geht von festen ColumnHeadern aus.

Ich habs so gelöst, daß ich beim Anlegen der Header deren Key belege und statt auf feste Indices einfach auf diesen Key abfrage, ob ein Datumsfeld oder ein Zahlenfeld das neue Sortierkriterium ist.
Außerdem läßt sich das Ganze recht einfach und mit wenig Aufwand in beide Richtungen sortieren und sogar noch mit der Anzeige des Sortierreihenfolge-Icons verbinden.

Kommentar von MyNeXX am 29.12.2004 um 14:13

Ich finde diesen Code gut, aber funktioniert er bei mir nur mit diesem original Beispiel. Ich habe versucht, diesen Code etwas (z.B.: Index, If-abfrage weg) zu veränder, jedoch ohne Erfolg!

mfg
MyNeXX

Kommentar von da_hoschla am 01.12.2003 um 00:02

moin,
auch bei ganz normalen zahlen funktioniert es nicht so richtig. oder ist 10603 < 1257 ?

Kommentar von SNo am 25.06.2003 um 18:12

Hallo,
ein Problem mit dieser Methode gibts leider bei negativen Zahlen.