ich habe da mal eine Frage bzw. ein Problem. Ich bin dabei von .NET auf XOJO umzusteigen und beschftige mich derzeit mit einem alten Programm von mir was ich jetzt nach XOJO Konvertieren mchte.
Zu meinem Problem: Ich versuche ein TreeView (Einhugur) dynamisch aus einer Datenbank zu befhlen. ber Beispiele wie ich es am besten machen kann wre ich sehr dankbar.
Protected Sub PopulateTreeView(ByVal parentNode As TreeNodeCollection, ByVal parentID As Integer, ByVal folders As DataTable)
For Each folder As DataRow In folders.Rows
If Convert.ToInt32(folder("parentID")) Is parentID Then
Dim key As String = folder("ID").ToString()
Dim text As String = folder("title").ToString()
Dim newParentNode As TreeNodeCollection = parentNode.Add(key, text).Nodes
PopulateTreeView(newParentNode, Convert.ToInt32(folder("ID")), folders)
End If
Next
End Sub
Die Tabelle aus dem das TreeView gefllt werden soll sieht so aus:
CREATE TABLE "folders" (
"folderId" INTEGER NOT NULL,
"parentId" INTEGER,
"folderName" TEXT NOT NULL,
PRIMARY KEY ("folderId")
);
Hier der Code wie ich ihn bis jetzt in XOJO konvertiert habe:
Me.TreeView1.LockDrawing = True
For i As Integer = 1 To folders.RecordCount
Dim name As String = folders.Field("folderName").StringValue
Dim child As New TreeViewNode(name)
child.ItemData = folders.Field("folderId").StringValue
If parentID = 0 Then
Me.TreeView1.AppendNode(child)
Dim rs As RecordSet = App.mCachedDatabase.SQLSelect("SELECT * FROM [folders] WHERE parentId = " + child.ItemData)
PopulateTreeView(child, child.ItemData, rs)
Else
parentNode.AppendNode(child)
End If
folders.MoveNext
Next
Me.TreeView1.LockDrawing = False
Beim Durchlaufen eines Recordsets würde ich die in der Dokumentation beschriebene Variante nehmen:
If folders <> Nil Then
While Not folders.EOF
DataList.AddRow(data folders IdxField(1).StringValue)
folders.MoveNext
Wend
folders.Close
End If
Ich gaube mit einer For-While-Schleife funktioniert das aktuell noch nicht. Ist ein Relikt aus alten Tagen, wird wohl aber jetzt mit der API 2.0 überholt.
Ich habe da ziemlich alten Code. Wenn ich Zeit habe, mache ich da ein Beispiel draus.
Du ldst nur die oberste Ebene. Wenn Du eine Node aufklappst, dann werden die weiteren Elemente geladen. Beim Zuklappen der Node werden die Elemente wieder entfernt.
Ein möglicher Ansatz ist in diesem Beispiel Projekt ‘TreeView’.
Hier wird vorab eine “verschachtelte Liste” (eine Klasse CTreeListedValues) gefüllt - und enthält dann die Inhalte (das “Verzeichnis” mit mehreren Ebenen).
Diese Struktur wird der Listbox Subklasse übergeben, welche sich dann um das ein/ausklappen und um die Darstellung der verschiedenen Ebenen usw. kümmert.
Das Beispiel kann selbstverständlich nach eigenen Bedürfnissen angepasst werden - ob und wie das mit dem Einhugur TreeView auch ginge, das kann ich nicht beantworten… Das Beispiel verwendet die Standard Listbox von Xojo.
Der Unterschied bei diesem Ansatz ist, dass eine “komplette TreeView” immer vorhanden ist. Es muss also nicht wie beim Ansatz von @Beatrix Willius die Unter-Elemente immer wieder geladen/verworfen werden. Das aber macht vielleicht dann mehr Sinn, wenn riesige Datenmengen vorhanden sind…
leider hat der Tip von @Jürg Otter mir nicht wirklich weiter geholfen. Ich stehe noch immer vor dem selben problem das mir die Nodes nicht richtig geladen werden. Hat den noch einer einen Tip für mich?