Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TreeView aus DB mit parentIDs generieren

  Alt 23. Jan 2008, 11:05
Ich habe es so gelöst (damit lassen sich auch Strukturen mit 100.000.000 Einträgen *sofort* in einer Treeview darstellen)

1. Treeview zeigt alle Root-Elemente. Jedes Root-Element enthält genau einen Kindknoten. Der ist als 'dummy' gekennzeichnet. Das Dummy-Kind ist nicht sichtbar (collapsed). dafür hat jeder Knoten ein '+', auch wenn er gar keine Kinder hat.
2. Im OnExpand-Ereignis prüfe ich, ob der Kindknoten ein Dummy ist. Wenn ja, wird er entfernt und die nächste Ebene aus der DB mittels 'Select * from TreeStructure where ParentID = <ID-des-expandierten-Knotens>' geladen und in die Treeview gepackt. Jeder Knoten erhält wieder einen 'dummy'-Childknoten.

Der Vorteil ist eben, das die Treeview unmittelbar zur Verfügung steht, egal wie groß die TreeStructure-Tabelle auf der DB-Seite ist. Ich habe damit alle Verwaltungsbezirk-Unterbezirk-Straßen-Hausnummern Berlins (ca. 2 Mio) dargestellt. Wer will schon in seiner Treeview ALLES sehen?

Vielleicht mach ich mal ein Demo-Projekt daraus und stelle es hier rein. Es scheint eine Standard-Anforderung zu sein.

Ansonsten sortierst Du die Knoten nach Parent-ID und fügst jeden Knoten an die entsprechende Stelle. Dabei suchst Du nicht *jedesmal* nach dem Parent-Node der Treeview, sondern nur dann, wenn sich die Parent-ID zwischen dem einzufügenden und dem vorherigen Eintrag geändert hat. Das geht auch recht flott.

Experimentier doch einfach mal damit und zeig uns Deine Ergebnisse. Es ist bestimmt interessant, ab wieviel Einträgen so ein statischen Laden aller Knoten zu langsam wird.

Ach ja, die TVirtualTreeView von Mike Lischke ist 1000x (mindestens) schneller als die Windows-Treeview und dürfte so bis zu einigen tausend statisch einzufügenden Knoten die richtige Wahl sein.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat