TreeView-Knoten sortieren
Veröffentlicht: 10. Jan 2005
Von Mathias Schiffer
Das ListView-Steuerelement von Windows Forms bietet wie selbstverständlich eine Sort-Methode an. Nichts dergleichen hingegen findet sich beim TreeView-Steuerelement. Wir schaffen Abhilfe.
Das .NET Framework bietet mit der CompareTo-Funktion einen komfortablen Weg an, zwei Elemente miteinander zu vergleichen. Dank ihrer Hilfe ist es nur noch ein Schritt bis zur Sortierung von Elementen einer Menge, wie schon im MSDN Quickie „Arraysortierungen mit Visual Basic .NET“ gezeigt.
In diesem MSDN Quickie werden wir diese praktische Funktion verwenden, um Texteinträge eines Treeview-Knotens zu sortieren. Die grundlegende Idee des einfachen Algorithmus ist dabei, zwei Elemente der Knoteneinträge zu vergleichen und bei unpassender Sortierung gegeneinander auszutauschen.
TreeView-Knotensortierung
Die Methode SortNodes erledigt diese Aufgabe für Sie: Sie übergeben einfach ein Objekt vom Typ NodesCollection, das die Elemente eines TreeView-Knotens enthält (z.B. die Nodes-Eigenschaft des TreeView-Steuerelements selbst für die oberste Knotenebene). Zusätzlich können Sie noch angeben, ob dessen Einträge alphabetisch aufwärts oder abwärts sortiert werden sollen:
Public Sub SortNodes(ByVal NodesCollection As System.Windows.Forms.TreeNodeCollection, _ Optional ByVal Ascending As Boolean = True) Dim node1, node2 As System.Windows.Forms.TreeNode Dim iTn1, iTn2 As Integer Dim k As Integer Dim iCompareResult As Integer ' Alle Knoten durchwandern For i As Integer = 0 To NodesCollection.Count k = NodesCollection.Count Do While k > i k -= 1 ' Je zwei Nodes ermitteln und Texte vergleichen node1 = NodesCollection(i) node2 = NodesCollection(k) Console.WriteLine(node1.Text & ", " & node2.Text) iCompareResult = node1.Text.CompareTo(node2.Text) ' Falls die Sortierung nicht dem übergebenen Sortierkriterium entspricht: If (Ascending = True And iCompareResult > 0) _ OrElse _ (Ascending = False And iCompareResult < 0) Then ' Nodes austauschen With NodesCollection .Remove(node1) .Remove(node2) .Insert(i, node2) .Insert(k, node1) End With End If Loop Next End Sub
Unterknotensortierung per Rekursion
Eine kleine Erweiterung der Prozedur ermöglicht es, nicht nur eine Nodes-Ebene zu sortieren: Durch den Einbau eines simpel gehaltenen Rekursionsschritts kann in der folgenden Variante der zusätzliche Parameter SortChildNodes zu True gesetzt werden, um auch alle Node-Ebenen unterhalb der übergebenen Ebene identisch sortieren zu können:
Public Sub SortNodes(ByVal NodesCollection As System.Windows.Forms.TreeNodeCollection, _ Optional ByVal Ascending As Boolean = True, _ Optional ByVal SortChildNodes As Boolean = False) Dim node1, node2 As System.Windows.Forms.TreeNode Dim iTn1, iTn2 As Integer Dim k As Integer Dim iCompareResult As Integer ' SortChildNodes: Ggf. Rekursion einleiten If SortChildNodes Then For i As Integer = 0 To NodesCollection.Count - 1 Call SortNodes(NodesCollection(i).Nodes, Ascending, SortChildNodes) Next i End If ' Alle Knoten durchwandern For i As Integer = 0 To NodesCollection.Count - 1 Console.WriteLine(NodesCollection(i).Text) k = NodesCollection.Count Do While k > i k -= 1 ' Je zwei Nodes ermitteln und Texte vergleichen node1 = NodesCollection(i) node2 = NodesCollection(k) iCompareResult = node1.Text.CompareTo(node2.Text) ' Falls die Sortierung nicht dem übergebenen Sortierkriterium entspricht: If (Ascending = True And iCompareResult > 0) _ OrElse _ (Ascending = False And iCompareResult < 0) Then ' Nodes austauschen With NodesCollection .Remove(node1) .Remove(node2) .Insert(i, node2) .Insert(k, node1) End With End If Loop Next End Sub
Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.