Wie ein TreeView richtig füllen?



  • Hi. Ich versuche ein TreeView aus einer Datenbank zu füllen. Dabei habe ich aus der Datenbank die Abhängigkeiten in Form eines Zahlenwertes (Werte 1-5, wobei immer der vorangehende in Bezug steht. Beispielsweise so:

    Text1
    Text2
    Text3
      ----- Text31
      ----- Text32
               -----Text321
      ----- Text33
               -----Text331
    Text4
    

    usw.

    Nun habe ich Probleme mit den Nodes. Über

    TreeView1->Items->Add(Node1,DataSource1->DataSet->FieldByName("Feldname")->AsString);
    

    kann ich mühelos die unterste Ebene neu mit Werten anlegen. Auch das anlegen über AddChild funktioniert einwandfrei. Mein Problem besteht darin, wie ich kontrolliert von z.B. Text321 nach Text33 komme und danach nach Text331 usw.

    Habe mir die Borland Hilfe mal angeschaut und auch hier im Forum und im WWW, aber das finde ich eher verwirrend. Kennt jemand einen guten Link, wo die ganzen Sachen mit GetLastChild, GetNext usw. beschrieben werden?

    Danke
    Carsten



  • Du mußt dir eine Liste aller Parent-Nodes merken und bei jedem neuen Unterknoten diesen als neuen Parent hinzufügen.

    Beispiel:

    const int MaxParents = 10;
    TTreeNode *Parents[MaxParents]; alternativ kannst du auch einen Vector oder eine Liste benutzen
    
    Parents[0] = 0; // Sonderbehandlung für Top-Level Knoten
    
    // bei einem neuen Unterknoten
    Parents[Level] = Parents[Level-1]->Items->Add("Neuer Knoten"); // Level ist dein Level-Wert (1-5) aus der Datenbank
    

    Du mußt jetzt nur noch für Top-Level-Knoten die Sondernbehandlung ausprogrammieren (d.h. dann auf TreeView->Items statt auf Parents[0]->Items zugreifen)

    P.S: Ich hoffe, ich habe deine Zahlenwerte 1-5 als Level richtig interpretiert...



  • grandmasterb10 schrieb:

    Mein Problem besteht darin, wie ich kontrolliert von z.B. Text321 nach Text33 komme und danach nach Text331 usw.

    Dafür mußt Du einfach nur von dem entsprechenden TreeNode aus GetNext aufrufen. Dies liefert Dir jeweils den nächsten Eintrag, egal ob untergeordnet, auf gleicher Ebene, oder übergeordnet.

    In der BCB-Hilfe ist folgendes Beispiel;

    TTreeNode *CurItem = TreeView1->Items->GetFirstNode();
    while (CurItem)
    {
      ListBox1->Items->Add(CurItem->Text);
      CurItem = CurItem->GetNext();
    }
    

    Damit iterierst Du durch den kompletten TreeView. Schau Dir unbedingt mal die Hilfe zu TTreeNodes und TTreeNode an.



  • @Th : Danke erst einmal für Deinen Tip. Ich hatte es mit einem normalen Array auch schon versucht, was aber die Auflistung imens bremst.
    Würde gerne Deine Version testen, aber leider hat TTreeNode keine Methode Add

    Parents[Level] = Parents[Level-1]->Items->Add("Neuer Knoten"); // Level ist dein Level-Wert (1-5) aus der Datenbank
    

    funktioniert dabei nicht 😞

    @Joe_M : Ich möchte ja nicht einen vorhandenen Tree nach Nodes ablaufen, sondern einen Tree erstellen.
    Hatte mir bereits die BCB-Hilfe zu TTreeNode angeschaut.

    Gruss
    Carsten



  • Es funktioniert. Manchmal sieht man die Hand vor Trees nicht 😉
    So funktioniert es :

    Parents[Level] = TreeView1->Items->AddChild(Parents[Level-1],DataSource1->DataSet->FieldByName("Feldname")->AsString);
    

    Danke für die Hilfe


Log in to reply