Code prüfen für TreeView füllen

23/08/2008 - 22:30 von Maxi | Report spam
Hallo,

ich muss/möchte Eintràge in eine TreeView schreiben aber die
bestehende Struktur beibehalten und wenn Eintrag fehlt, diesen
entsprechend hinzufügen.

Die Lösung war für mich nicht gerade naheliegend :-) beginne auch erst
mit VB

Nach etwas überlegen und planen wie ich vorgehen soll, ist
mittlerweile über versuch/irrtum olgender Code entstanden, der zwar
das tut was ich will, mir aber etwas umstàndlich erscheint.

Daher möchte ich Euch bitten das mal anzuschauen und ggf mich zu
korrigiere, sicher geht das was ich möchte einfacher als ich um sieben
Ecken gedacht habe :-))

Da die Eintràge durchaus auch mal mit Kleinbuchstaben kommen können
ich aber wenigstens sicherstellen möchte das gleiche Eintràge auch
wenn Gross-/Kleinbuchstabe zusammen gehören, habe ich mit lcase() oder
wo es ging mit .ToLower gearbeitet.

Wàre super wenn Ihr mir einen besseren Weg zum Ziel aufzeigen könntet.


Gruss,
Maxi



-
Private Function SearchTree(ByVal TreeNode As TreeNode, ByVal
SearchString As String) As TreeNode
For Each NodeEntry As TreeNode In TreeNode.Nodes
If NodeEntry.Text.ToLower = SearchString.ToLower Then
SearchTree = NodeEntry
Exit Function
End If
Next
SearchTree = TreeNode.Nodes.Add(SearchString)
End Function
-
Private Sub CallRecursive(ByVal aTreeView As TreeView, ByVal
aEntry As String)
'zerlegen des Eintrages in die einzelnen Teil-Eintràge
Dim arrBuffer As New ArrayList

arrBuffer.AddRange(aEntry.Split(System.IO.Path.DirectorySeparatorChar).ToArray)
'Hilfsnode für rekursiven Aufruf
Dim n As TreeNode
'Hilfsvariable gesuchter Node gefunden ja/nein
Dim found As Boolean = False
'durchgehen des obersten Node für Startpunkt, anlegen wenn
nicht vorhanden
For Each n In aTreeView.Nodes
If LCase(arrBuffer(0)) = n.Text.ToLower Then
found = True
'aus For Each rausspringen wenn Node gefunden, n Startpunkt für rekursiven Aufruf
Exit For
End If
Next
'wenn Node nicht gefunden wurde, muss er angelegt werden, n
wird auf neuen Node gesetzt
If Not found Then
n = aTreeView.Nodes.Add(arrBuffer(0))
End If
'durchgehen der einzelnen Eintràge
For a As Integer = 1 To arrBuffer.Count - 1
n = SearchTree(n, arrBuffer(a))
Next
End Sub
-
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button7.Click
'leeren der Anzeige
TreeView1.Nodes.Clear()
'Darstellung abschalten für Beschleunigung
TreeView1.BeginUpdate()
'verschiedene Eintràge vornehmen
CallRecursive(TreeView1,
"Knoten1\knoten11\knoten111\test.txt")
CallRecursive(TreeView1,
"Knoten0\knoten11\knoten111\test.txt")
CallRecursive(TreeView1,
"Knoten2\knoten11\knoten111\test.txt")
CallRecursive(TreeView1,
"knoten2\knoten11\knoten011\test.txt")
CallRecursive(TreeView1,
"Knoten3\knoten12\knoten111\test.txt")
CallRecursive(TreeView1,
"Knoten3\knoten12\Knoten111\test.txt")
CallRecursive(TreeView1,
"Knoten3\Knoten12\Knoten121\test.txt")
CallRecursive(TreeView1,
"Knoten4\knoten11\knoten111\test.txt")
'Tree sortieren
TreeView1.Sort()
'Darstellung wieder aktivieren
TreeView1.EndUpdate()
'alle Eintàge aufklappen
TreeView1.ExpandAll()
End Sub
 

Lesen sie die antworten

#1 Peter Fleischer
24/08/2008 - 10:04 | Warnen spam
"Maxi" schrieb im Newsbeitrag
news:

...
Daher möchte ich Euch bitten das mal anzuschauen und ggf mich zu
korrigiere, sicher geht das was ich möchte einfacher als ich um sieben
Ecken gedacht habe :-))



Zuserst sollte Option Strich On gesetzt werden, als ArrayList sollte besser
eine List<Of String> genutzt werden. Der Code könnte dann so aussehen (für
VB9):

Option Infer On
Option Strict On

Public Class Form1

Dim WithEvents Button7 As New Button _
With {.Dock = DockStyle.Top, .Text = "Füllen"}
Dim TreeView1 As New TreeView _
With {.Dock = DockStyle.Fill}

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Me.Controls.AddRange(New Control() {TreeView1, Button7})
End Sub

Private Function SearchTree(ByVal TreeNode As TreeNode, _
ByVal SearchString As String) As TreeNode
For Each NodeEntry As TreeNode In TreeNode.Nodes
If NodeEntry.Text.ToLower = _
SearchString.ToLower Then Return NodeEntry
Next
Return TreeNode.Nodes.Add(SearchString)
End Function

Private Sub CallRecursive(ByVal aTreeView As TreeView, _
ByVal aEntry As String)
'zerlegen des Eintrages in die einzelnen Teil-Eintràge
Dim arrBuffer As New List(Of String)
'
arrBuffer.AddRange(aEntry.Split(System.IO.Path.DirectorySeparatorChar).ToArray)
'Hilfsnode für rekursiven Aufruf
Dim n As TreeNode = Nothing
'durchgehen des obersten Node für Startpunkt,
' anlegen wenn nicht vorhanden
For Each n In aTreeView.Nodes
'aus For Each rausspringen wenn Node gefunden,
' n = Startpunkt für rekursiven Aufruf
If LCase(arrBuffer(0)) = n.Text.ToLower Then Exit For
Next
'wenn Node nicht gefunden wurde,
' muss er angelegt werden, n wird auf neuen Node gesetzt
If n Is Nothing Then n = aTreeView.Nodes.Add(arrBuffer(0))
'durchgehen der einzelnen Eintràge
For a As Integer = 1 To arrBuffer.Count - 1
n = SearchTree(n, arrBuffer(a))
Next
End Sub

Private Sub Button7_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)_
Handles Button7.Click
'leeren der Anzeige
TreeView1.Nodes.Clear()
'Darstellung abschalten für Beschleunigung
TreeView1.BeginUpdate()
'verschiedene Eintràge vornehmen
CallRecursive(TreeView1, _
"Knoten1\knoten11\knoten111\test.txt")
CallRecursive(TreeView1, _
"Knoten0\knoten11\knoten111\test.txt")
CallRecursive(TreeView1, _
"Knoten2\knoten11\knoten111\test.txt")
CallRecursive(TreeView1, _
"knoten2\knoten11\knoten011\test.txt")
CallRecursive(TreeView1, _
"Knoten3\knoten12\knoten111\test.txt")
CallRecursive(TreeView1, _
"Knoten3\knoten12\Knoten111\test.txt")
CallRecursive(TreeView1, _
"Knoten3\Knoten12\Knoten121\test.txt")
CallRecursive(TreeView1, _
"Knoten4\knoten11\knoten111\test.txt")
'Tree sortieren
TreeView1.Sort()
'Darstellung wieder aktivieren
TreeView1.EndUpdate()
'alle Eintàge aufklappen
TreeView1.ExpandAll()
End Sub

End Class


Viele Gruesse

Peter

Ähnliche fragen