Hey Leute,
ich suche nach einer Möglichkeit einen TreeView zu durchsuchen und wie es zum Beispiel After Effects macht alles überflüssige zu entfernen und am besten noch die einzelnen Nodes aufzuklappen.
Ich habe es Iterativ wie rekursiv auf alle Arten die mir eingefallen sind versucht aber ich komme nicht drauf. Wichtig ist das die Trees unterschiedlich tief gehen.
Bevor ein Knoten entfernt wird muss natürlich überprüft werden ob in den Unterknoten vllt ein Treffer ist.
Wer eine Idee hat bitte schreiben :P
Hiermit bin ich ganz nahe an der Lösung allerdings bekommt man eine System.OutOfRange Fehlermeldung wenn ich anstelle von: n.Text = ""
den Remove Befehl einsetze
Code:
Private Sub SearchNode(ByVal prnt As TreeNode)
For Each n As TreeNode In prnt.Nodes
If n.Text.Contains(TextBox1.Text) Then
n.BackColor = Color.Gray
Dim h As TreeNode = n.Parent
Else
If n.Nodes.Count = 0 Then
n.Text = ""
Else
End If
End If
SearchNode(n)
Next
End Sub
LÖSUNG
Hey
Auf die Lösung bin ich schon vor ein paar Tage gekommen habe sie aber nicht gepostet da ich dachte vllt hat jemand eine bessere:
Zunächst werden zwei unabhängige TreeNodeCollections bzw. Listen erstellt:
In Meiner Hauptform
Code:
Public ObjektTree As New List(Of TreeNode)
Public TNC As TreeNodeCollection
Dazu in meinem Ladefenster
Code:
Dim myNode As New TreeNode
Dim saveNode As New TreeNode
myNode.Text = "Property"
FillTree(myNode, "D:\ymir work\bin\property")
FillTree(saveNode, "D:\ymir work\bin\property")
frm_main.ObjektTree.Add(saveNode)
saveNode.Text = "Property"
frm_main.TreeView1.Nodes.Add(myNode)
Dann die Suchfunktion welche durch einen klick auf Enter gestertet wird:
Der Startbefehl
Code:
If e.KeyCode = Keys.Enter Then
If TextBox1.Text <> "" Then
SearchNode(TreeView1.Nodes(0))
statusBar.Maximum = SearchRemoveList.Count - 1
For i As Integer = 0 To SearchRemoveList.Count - 1
SearchRemoveList(i).Remove()
statusBar.Value = i
Next
TreeView1.Nodes(0).ExpandAll()
Else
TreeView1.Nodes.Clear()
For Each n As TreeNode In ObjektTree
TreeView1.Nodes.Add(n)
Next
End If
End If
Die Suche
Code:
Dim SearchRemoveList As New List(Of TreeNode)
Private Sub SearchNode(ByVal prnt As TreeNode)
Dim CanReMoveParent As Boolean = True
Dim NodeList As New List(Of TreeNode)
For Each n As TreeNode In prnt.Nodes
If n.Text.Contains(TextBox1.Text) Then
prnt.ExpandAll()
CanReMoveParent = False
Else
If n.Nodes.Count = 0 Then
n.Text = ""
SearchRemoveList.Add(n)
Else
CanReMoveParent = False
NodeList.Add(n)
End If
End If
Next
If CanReMoveParent = True Then
prnt.Remove()
Else
For Each n As TreeNode In NodeList
SearchNode(n)
Next
End If
End Sub
Hierbei handelt es sich noch nicht um die Optimale Lösung welche Beispielsweise Adobe hat, diese Suche benötigt weitaus mehr Zeit