Sie sind dabei, einen eigenen Dateidialog oder Kunden- und Artikelverwaltung zu proggen und nutzen dazu das Listview Control. Jetzt sollen die Spalten nach verschiedenen Kriterien sortiert werden. Ein Nachteil des Listview Controls ist, dass es nur alphanumerisch sortieren kann. Doch was ist, wenn Sie es nach Datum, Zeit oder Zahl sortieren wollen? Das nachfolgende Modul basiert auf den Tipp: Folgende Sortierroutinen wurden ergänzt und stehen zur Verfügung:
Anmerkung: Die Sortierung "SortHHMM" und "SortHHMMSS" sind nur dann nötig, wenn die zu sortierende Zeit nicht dem Standard Format "hh:mm" oder "hh:mm:ss" entspricht. Nachfolgenden Code bitte in ein MODUL einfügen: Option Explicit ' **************************************************** ' * * ' * Modul MultiSort-ListView * ' * * ' * Sortiert ein Listview nach Standard Text, * ' * Numerisch, Datum(DD.MM.YYYY), Zeit(HH:MM), * ' * Zeit(HH:MM:SS) und nach der VB Function * ' * FileDateTime(DD.MM.YYYY HH:MM:SS). * ' * * ' * Basis dieses Moduls ist der Tipp in VB@rchiv * ' * "Numerische Sortierung im ListView-Control" * ' * von Michael Hartmann. * ' * Erweiterung der Sort-Funktionen * ' * von Roland Wutzke, Februar 2003. * ' * * ' **************************************************** Private Declare Function LockWindowUpdate Lib "user32.dll" ( _ ByVal hWnd As Long) As Long Public Enum lvwSortType SortText = 0 SortNumeric = 1 SortDate = 2 SortHHMM = 3 SortHHMMSS = 4 SortFileDateTime = 5 End Enum Public Sub MultiSortListView(ByVal Index As Integer, _ ByVal CurrentListView As ListView, _ Optional vSortType As lvwSortType = SortText) Dim I As Integer Dim strFormat As String Dim strData() As String Dim lRet As Long On Error GoTo ErrorHandler ' Benutzerdefinierter Formatstring für die ' Format-Funktion ermitteln. Select Case vSortType ' Wenn vSortType = SortText, Standard Sortierung ' nach String erzwingen und die Sub verlassen. Case SortText With CurrentListView .SortKey = Index .Sorted = True .SortOrder = 1 - .SortOrder Exit Sub End With ' Formatstring für numerische Sortierung setzen Case SortNumeric strFormat = String(30, "0") & "." & String(30, "0") ' Formatstring für Sortierung nach Datum setzen Case SortDate strFormat = String(2, "0") & "." & String(2, "0") & "." & String(4, "0") ' Formatstring für Sortierung nach Zeit HHMM setzen Case SortHHMM strFormat = "hh:mm" ' Formatstring für Sortierung nach Zeit HHMMSS setzen Case SortHHMMSS strFormat = "hh:mm:ss" ' Formatstring für Sortierung nach FileDateTime setzen Case SortFileDateTime strFormat = String(2, "0") & "." & String(2, "0") & "." & String(4, "0") strFormat = strFormat & " " & "hh:mm:ss" ' Falscher, bzw. ungültiger SortType, dann Sub verlassen Case Else Exit Sub End Select ' Automatische Aktualisierung des Fensters sperren lRet = LockWindowUpdate(CurrentListView.Parent.hWnd) If lRet = 0& Then Call MsgBox("Can't lock window " & _ CurrentListView.Parent.hWnd, _ vbOKOnly + vbCritical) Exit Sub End If With CurrentListView With .ListItems If (Index > 0) Then ' Sortierung nach Subitems For I = 1 To .Count With .Item(I).ListSubItems(Index) ' Sichern des aktuellen Wertes der ' Text-Eigenschaft in der Tag-Eigenschaft, ' ohne einen evtl. Inhalt der Tag-Eigenschaft ' zu überschreiben .Tag = .Text & vbNullChar & .Tag Select Case vSortType Case SortNumeric ' Falls die Text-Eigenschaft der SubItems ' eine Zahl ist, so formatiere mit dem oben ' definierten Formatstring. If IsNumeric(.Text) Then .Text = Format$(CDbl(.Text), strFormat) End If Case SortDate ' Falls die Text-Eigenschaft der SubItems ' ein Datum ist, so formatiere mit dem oben ' definierten Formatstring. If IsDate(.Text) Then .Text = Format$(CDate(.Text), strFormat) End If Case SortHHMM ' Falls die Text-Eigenschaft der SubItems ' Zeit HH:MM ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) Case SortHHMMSS ' Falls die Text-Eigenschaft der SubItems ' Zeit HH:MM:SS ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) Case SortFileDateTime ' Falls die Text-Eigenschaft der SubItems ' VB FileDateTime ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) End Select End With Next I Else ' Sortierung nach Mainitem For I = 1 To .Count With .Item(I) ' Sichern des aktuellen Wertes der ' Text-Eigenschaft in der Tag-Eigenschaft, ' ohne einen evtl. Inhalt der Tag-Eigenschaft ' zu überschreiben .Tag = .Text & vbNullChar & .Tag Select Case vSortType Case SortNumeric ' Falls die Text-Eigenschaft der SubItems ' eine Zahl ist, so formatiere mit dem oben ' definierten Formatstring. If IsNumeric(.Text) Then .Text = Format$(CDbl(.Text), strFormat) End If Case SortDate ' Falls die Text-Eigenschaft der SubItems ' ein Datum ist, so formatiere mit dem oben ' definierten Formatstring. If IsDate(.Text) Then .Text = Format$(CDate(.Text), strFormat) End If Case SortHHMM ' Falls die Text-Eigenschaft der SubItems ' Zeit HH:MM ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) Case SortHHMMSS ' Falls die Text-Eigenschaft der SubItems ' Zeit HH:MM:SS ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) Case SortFileDateTime ' Falls die Text-Eigenschaft der SubItems ' VB FileDateTime ist, so formatiere mit dem oben ' definierten Formatstring. .Text = Format$(.Text, strFormat) End Select End With Next I End If End With ' Sortiere die umformatierten Spalten neu .SortKey = Index .Sorted = True .SortOrder = 1 - .SortOrder With .ListItems If (Index > 0) Then ' Sortierung nach SubItem For I = 1 To .Count With .Item(I).ListSubItems(Index) ' Extrahiere den ursprünglichen Inhalt des ' Subitems aus der Tag Eingeschaft und ' stelle ihn wieder in die Text-Eigenschaft ' ein. strData = Split(.Tag, vbNullChar) .Text = strData(0) .Tag = strData(1) End With Next I Else ' Sortierung nach MainItem For I = 1 To .Count With .Item(I) ' Extrahiere den ursprünglichen Inhalt des ' Subitems aus der Tag Eingeschaft und ' stelle ihn wieder in die Text-Eigenschaft ' ein. strData = Split(.Tag, vbNullChar) .Text = strData(0) .Tag = strData(1) End With Next I End If End With End With ' Aufheben der Aktualisierungssperre für das Fenster lRet = LockWindowUpdate(0&) Exit Sub ErrorHandler: lRet = LockWindowUpdate(0&) Call MsgBox("Runtime error " & Err.Number & ": " & _ vbCrLf & Err.Description, vbOKOnly + vbCritical) End Sub Beispiel: Private Sub ListView1_ColumnClick( _ ByVal ColumnHeader As MSComctlLib.ColumnHeader) Dim nIndex As Long nIndex = ColumnHeader.Index - 1 With ListView1 Select Case ColumnHeader ' Sortieren nach Text Case "Datei" MultiSortListView nIndex, ListView1 ' Sortieren nach FileDateTime Case "Datum" MultiSortListView nIndex, ListView1, SortFileDateTime ' Sortieren nach Zahl Case "Größe" MultiSortListView nIndex, ListView1, SortNumeric End Select End With End Sub Dieser Tipp wurde bereits 19.637 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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevCommand 4.0 Professionelle Schaltflächen im modernen Design! Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. |
||||||||||||||||
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. |