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 Text4usw.
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 DatenbankDu 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 AddParents[Level] = Parents[Level-1]->Items->Add("Neuer Knoten"); // Level ist dein Level-Wert (1-5) aus der Datenbankfunktioniert 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