![]() |
Treeview mit daten füllen
Ich habe mich nun mal an ein TreeView gewagt...
irgendwie bekomme ich das ding nicht anständig mit daten gefüttert.. also den kram mit addchild etc geht.. problem ist das ich anhand ner db ne baumstrucktur haben will.. also die kernfrage ist, wie ich expliziert nen knoten ansprechen kann, indem ein neues child rein soll... irgendwie knotennahme oder so geht nicht.. Also nehmen wir an [0] = 1, [1] = 2, [2] = 3 [4] = 1.1 ..... [7] = 1.1.1 ........... das ganze soll dann so aussehen;
Delphi-Quellcode:
und die baumtiefe soll auch dynamisch werden...
1
|-1.1 | |-1.1.1 | |-1.1.2 | |-1-1-3 |-1.2 | |-1.2.1 | |-1.2.2 | |-1-2-3 |-1.3 | |-1.3.1 | |-1.3.2 | |-1-3-3 2 |-2.1 ........ jenad eine idee wie es mit der normalen Treeview geht.. oder vielleicht jemand ein toturial zur hand ? MfG Real Thunder |
Re: Treeview mit daten füllen
Schau Dich mal
![]() |
Re: Treeview mit daten füllen
brauchst dazu nur 2 Spalten in der Datenbank (+Spalten für deine Daten)
Schlüssel und ParentSchlüssel ParentSchlüssel = NULL wenn die Knoten sich auf der Root befinden. Ansonsten der Schlüssel als welchen sich die Daten als Child einhängen sollen. Das lesen von solchen Strukturen aus der Datenbank ist aber unperformat. Wenn du dann mal viel Zeit hast, solltest du dir anschauen wie nested Sets funktionieren. |
Re: Treeview mit daten füllen
Hallo Real_Thunder,
vor dem Problem stand ich vor ein paar Tagen auch, ich habe es so gelöst (mit dem ![]()
Delphi-Quellcode:
Erklärung:
Type
TBaseTreeObj = class Caption: String; ID: integer; ParentID: integer; OrderSeq: integer; Level: integer; end; PTreeData = ^TTreeData; TTreeData = record TreeObj: TBaseTreeObj; end; [...] function TVirtualStringTreeHandle.AddNodeByParentID(aParentID: integer; aTreeObj: TBaseTreeObj): PVirtualNode; function FindParentNode(ParentID: Integer): PVirtualNode; var NodeData: PTreeData; begin Result:= fVST.GetFirst; while Assigned(Result) do begin NodeData:= PTreeData(fVST.GetNodeData(Result)); If NodeData^.TreeObj.ID = ParentID then exit; Result:= fVST.GetNext(Result); end; end; var Data: PTreeData; LNode: PVirtualNode; begin If not assigned(aTreeObj) then exit; If aParentID = 0 then result:= fVST.AddChild(nil) else result:= fVST.AddChild(FindParentNode(aParentID)); fVST.ValidateNode(Result, False); Data:= fVST.GetNodeData(Result); { TreeObjekt-Pointer zuweisen } Data^.TreeObj:= aTreeObj; end; function TVirtualStringTreeHandle.BuildTreeFromDataSource(aQuery: TQuery): Boolean; var BaseTreeObj: TBaseTreeObj; ParentID: integer; begin fVST.BeginUpdate; fVST.Clear; try with aQuery do begin while not EOF do begin { Event abfeuern, um Daten zu holen und TreeObjekt zu erstellen } FillTreeObjWithTableData(aQuery, BaseTreeObj); // HIER KANNST DU STATT EINES EVENTS DIREKT DIE DATEN AUS // DEM AKTUELLEN DATENSATZ DEM KNOTEN ANHÄNGEN { Knoten hinzufügen, indem nach Elter-ID gesucht wir } AddNodeByParentID(BaseTreeObj.ParentID, BaseTreeObj); next; end; end; finally fVST.EndUpdate; end; aQuery.First; If fVST.GetFirst <> NIL then begin FocusedNode(fVST.GetFirst); fVST.Expanded[fVST.GetFirst]:= true; end; end; Die Datenbank hat wie schon im Beitrag darüber erwähnt, u.a. die Felder ID und ParentID. Jeder Eintrag weiß also, wem er gehört. Du sortierst zuvor die DB nach ID und übergibst die Query der Funktion "BuildTreeFromDataSource". Wenn du allerdings Drag & Drop planst, dann ist die Sortierung nach ID nicht unbedingt mehr gültig; unter Umständen hättest du dann zuerst den "ChildNode" vor dem "ParentNode". Aus diesem Grund habe ich noch die Felder "Level" und "OrderSeq" eingeführt und lasse die Tabelle nach diesen Feldern aufsteigend sortieren. Nach jedem Drag & Drop müssen diese natürlich aktualisiert werden. Der Tree hat bei mir ein Objekt anstatt nur eines Records, damit ich das Objekt später für andere Verwendung erweitern kann. Du kannst es natürlich nur über ein Record lösen. Edit: Du musst dem VirtualStringTree sagen, welche Größe du an Daten im Knoten übergibst. Zudem gibt es eine fast unüber- schaubare Anzahl an Einstellmöglichkeiten. ![]() Gruß Pfoto |
Re: Treeview mit daten füllen
Die von mir verlinkte Komponente basiert auch auf dem Virtual StringTree ;)
|
Re: Treeview mit daten füllen
Zitat:
Dem Record und den Zeiger kann man sich schenken. ![]() ![]() |
Re: Treeview mit daten füllen
Danke für den Hinweis generic!
habe mir es gerade mal angeschaut und wieder was dazugelernt... Gruß Pfoto |
Re: Treeview mit daten füllen
So habe es nun mit der Standard Komponente und nem record gemacht und es läuft.
im record ist id:integer; name: string; position: TTreeNode; parent:integer; und schon weiß jeder Baumzweig an welchem zweig er dran ist. |
AW: Treeview mit daten füllen
wie kann ich einer Node einen Dateipfad hinterlegen? steh zurzeit etwas aufm Schlauch:cry:
|
AW: Treeview mit daten füllen
VST oder Standard-TreeView? Und soll der Pfad als Anzeige dienen oder als Wert hinterlegt werden?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz