|
Die Angabe eines Schlüssels ist zwar optional, wenn Sie in einem
TreeView-Steuerelement einen Knoten hinzufügen. Doch ohne diese
Schlüsselangabe ist es kaum möglich, einem anderen Knoten
untergeordnete Knoten hinzuzufügen. Denn dazu ist in der Regel die
Angabe des Schlüssels jenes übergeordneten Knotens notwendig.
Neben der freien Vergabe von wie auch immer generierten
Schlüsseln wäre die automatische Generierung von fortlaufenden
numerischen Schlüsseln eine Möglichkeit. Da das
TreeView-Steuerelement allerdings im Gegensatz zur normalen Visual
Basic-Collection keine reinen, lediglich als String übergebenen
numerischen Schlüssel akzeptiert, muss diesem noch irgend ein
String-Bestandteil hinzugefügt bzw. vorangestellt werden:
Dim Keys As Long
Keys = Keys + 1
TreeView.Nodes.Add [ParentKey], [tvwChild], "N" & Keys, [Text] ...
Zum Zugriff auf einen Knoten müssen Sie dann jedoch den
gewünschten Schlüssel bereits kennen. Denn diese Art der
Schlüsselzuweisung ist relativ willkürlich - aus ihr lässt sich
durch nichts mehr auf die Struktur des Baumes oder die Position
eines einzelnen Knoten schließen.
Der ideale Zugriff auf einen beliebigen Knoten wäre wohl ein
Zugriff wie in einem Dateisystem, nämlich durch Angabe eines
Pfades. Sie brauchen jedoch nicht alle Knoten in der
Nodes-Collection der Reihe nach durchlaufen, um den Knoten zu
finden, dessen FullPath-Eigenschaft mit dem gesuchten Pfad
übereinstimmt. Einfacher ist es, der Key-Eigenschaft direkt nach
dem Einfügen eines Knotens den Inhalt der FullPath-Eigenschaft
automatisch zuzuweisen - zum Beispiel:
Dim ParentNode As Node
Dim AnyNode As Node
Set ParentNode = TreeView.Nodes.Add(, , , "C:")
With ParentNode
.Key = .FullPath
End With
Set AnyNode = _
TreeView.Nodes.Add(ParentNode.Key, tvwChild, , "Windows")
With AnyNode
.Key = .FullPath
End With
With TreeView.Nodes.Add(AnyNode.Key, tvwChild, , "System")
.Key = .FullPath
End With
Den Knoten "C:\Windows\System" finden Sie
dann auf Anhieb:
Set Node = TreeView.Nodes("C:\Windows\System")
Wie Sie im obenstehenden Beispiel beim Einfügen des "System"-Knotens
gesehen haben werden, brauchen Sie den von der Add-Methode der
Nodes-Collection zurückgegebenen Knoten nicht unbedingt eigens
einer Objekt-Variablen zuzuweisen, wenn Sie ihn in der Folge nicht
weiter benötigen. Die Zuweisung des FullPath-Wertes als Schlüssel
kann ohne Probleme in der gezeigten verkürzten Form erfolgen.
Der Zugriff auf einen Knoten über eine solche Pfadangabe
funktioniert natürlich nur, solange nicht mittendrin der Name
(Text-Eigenschaft) eines Elements geändert wird. Der gesuchte Pfad
würde naturgemäß den geänderten Namen enthalten, und der
gesuchte Knoten würde nicht gefunden. Daher müssen Sie nach einer
Namensänderung die Schlüssel aller diesem Knoten untergeordneten
Knoten anpassen. Vom Code her ist das kein großer Aufwand, wie die
folgende rekursive Prozedur zeigt. Ist die Knotenstruktur unterhalb
des betreffenden Knotens sehr tief und/oder weit
verzweigt, kann das jedoch vielleicht einen kleinen Moment dauern -
aber besonders spürbar wird das kaum sein.
Public Sub ResetPathKeys(FromNode As Node)
Dim nChild As Node
With FromNode
.Key = .FullPath
Set nChild = .Child
Do While Not nChild Is Nothing
ResetPathKeys nChild
Set nChild = nChild.Next
Loop
End With
End Sub
Sie rufen diese Prozedur nach jeder Namensänderung auf und
übergeben ihr den betroffenen Knoten. Falls Sie die direkte
Änderung des Namens im TreeView-Steuerelement durch den Anwender
erlauben (Eigenschaft LabelEdit gleich 1 - tvwManual),
sollten Sie nicht vergessen, sie auch aus dem
AfterLabelEdit-Ereignis heraus aufzurufen. Die Referenz des Knotens,
dessen Name gerade geändert worden ist, finden Sie in der
SelectedItem-Eigenschaft des TreeView-Steuerelements.
Private Sub TreeView_AfterLabelEdit(Cancel As Integer, _
NewString As String)
ResetKeys TreeView.SelectedItem
End Sub
|