Free Trial

Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.


Share this Page URL
Help

Windows.Forms > 265 Einzelne Knoten eines TreeView-Steuerelements sortieren - Pg. 753

>> Windows.Forms 753 265 Einzelne Knoten eines TreeView Steuerelements sortieren Ein TreeView -Steuerelement erlaubt über die Sorted -Eigenschaft das generelle Sortieren nach den Knoten. Dabei werden allerdings immer alle Ebenen sortiert. Wenn Sie in einem TreeView - Steuerelement nur bestimmte Unterknoten bzw. nur bestimmte Ebenen sortieren wollen, müs- sen Sie etwas anders vorgehen. In den C#-Newsgroups fand ich dazu (als ich diese Zeilen ursprünglich schrieb und bei der Überarbeitung für das .NET Framework 2.0 ...) recht wenig Anregungen und schon gar keine fertigen Lösungen. Die einzige dort angedeutete Lösung ist der Aufruf der API-Funktion Send- Message mit der Nachricht TVM_SORTCHILDRENCB , die genau dazu vorgesehen ist. Leider ist diese wahrscheinlich sehr schnelle Lösung nicht einfach umzusetzen, weswegen ich im Buch darauf verzichte. Nur damit Sie wissen, worum es dabei geht: Bei dieser Lösung müssen Sie eine Callback-Methode zur Verfügung stellen, die drei IntPtr - Argumente übergeben bekommt. Die Adresse dieser Methode übergeben Sie über eine Struktur vom Typ TVSORTCB und einen Delegaten neben dem Handle des zu sortierenden Knotens und der Nachricht an SendMessage . Der Knoten ruft dann zur Sortierung für jeweils zwei Unterkno- ten die Callback-Methode auf. In dieser vergleichen Sie die beiden ersten übergebenen IntPtr - Werte (der dritte ist für benutzerdefinierte Zwecke vorgesehen). Ist der linke größer als der rechte, muss die Methode einen Wert kleiner null zurückgeben, ist der rechte größer als der linke, muss ein Wert größer null zurückgegeben werden, sind beide gleich groß, muss die Methode null zurückgeben. So weit, so gut. Leider werden in den Argumenten aber keine Referenzen auf die Knoten übergeben (was prinzipiell gar nicht möglich ist, da API-Funktio- nen keine Referenzen kennen), sondern benutzerdefinierte Daten. Und das ist das Problem, denn diese müssen Sie beim oder nach dem Füllen des TreeView in einer TVITEM -Struktur über eine TVM_GETITEM -Nachricht einlesen und über eine TVM_SETITEM -Nachricht in den Knoten zurückschreiben. Im Feld lParam der TVITEM -Struktur können Sie vor dem Schreiben einen int - Wert ablegen, der der Callback-Methode beim Sortieren übergeben wird. Dummerweise kön- nen Sie hier nicht einfach den Index des Knotens ablegen (was den Zugriff erleichtern würde), denn dieser wird beim Umsortieren ja verändert. Sie müssen sich einen Algorithmus überle- gen, der aus den dargestellten Daten des Knotens einen sortierbaren int -Wert generiert. Und das ist meiner Ansicht nach fast unmöglich. Deshalb habe ich eine einfachere Lösung entwickelt. Die Methode SortTreeViewNodes in Listing 504 sortiert eine TreeNodeCollection (die Sie über die Node -Eigenschaft eines Knotens errei- chen) über den guten alten Bubblesort. Das einzige Problem dabei ist, dass zum Vertauschen von zwei TreeNode -Objekten nicht einfach nur die Referenzen vertauscht werden können. Wenn Sie das machen, bringen Sie das TreeView -Steuerelement durcheinander (siehe Rezept 264). Um dies zu vermeiden ruft SortTreeViewNodes zum Tauschen einfach die entsprechenden Methoden der TreeNode -Objekte auf. Zum Kompilieren dieser Methode müssen Sie die Assembly System.Windows.Forms.dll referen- zieren und die Namensräume System und System.Windows.Forms importieren. Windows.Forms