TreeView mit Database

Hallo

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.

In VB.NET wrde das ganze so aussehen:

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

Wo ist deine genaue Frage?

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.

Mein Problem ist das ich eine Verzeichnis nachbilden muss. Also Mehr als nur eine Ebene.

Root

  • Item 1
  • Item 2
    • Item 2.1
    • Item 2.1.1
  • Item 3

…und so weiter

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…

Heja - viele Wege führen nach Rom :slight_smile:

Das werde ich mal genau anschauen da es dem was ich vorhabe bzw. meinem Programm doch sehr nahe kommt.

Guten Morgen liebe Mitglieder,

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?