VB 5/6-Tipp 0534: Listview nach Datum und Zahlen sortieren
von Peter K. Sauer
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: | Verwendete API-Aufrufe: keine | 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! '--- 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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
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.