Hallo zusammen,
ich spiele grade ein wenig mit der
TcxVirtualTreeList
Komponente im "provider mode" mit aktiviertem "smart load" (Child-Nodes werden erst beim Aufklappen hinzugefügt). Hierzu habe ich mir eine Data-Source von
TcxTreeListCustomDataSource
abgeleitet und die erforderlichen Methoden implementiert. Klappt soweit auch alles wunderbar.
Nun möchte ich eine Filter-Funktion auf Datenebene einbauen, um nur Datensätze anzeigen zu lassen, die den Filterkriterien entsprechen. Das Problem an dieser Stelle ist, dass meine zugrundeliegende Datenstruktur die "tatsächlichen" Daten nur in den Blättern liegen hat, ich also zum Überprüfen des Filterkriteriums zwangsweise bis ganz ans Ende eines Asts traviersieren muss. Dieses Verfahren muss ich nun in den
GetChildCount
und
GetChildRecordHandle
Methoden der Data-Source implementieren.
Nehmen wir mal an, ich hätte folgende Struktur:
Code:
root
| - child
| - child
| - data
| - child
| - data
Dann wird
GetChildCount
insgesamt 4x aufgerufen (theoretisch 6x, aber die Daten-Nodes können trivial 0 zurückgeben). Hierbei muss der Daten-Baum dann jeweils einmal vom entsprechenden Level aus bis zu den Blättern traversiert werden. Das ist schonmal unschön.
Noch problematischer wird es bei
GetChildRecordHandle
. Hier kann ich ja nun nicht mehr einfach auf
Child[Index]
zurückgreifen, sondern muss auch hier jedes Mal zwecks Überprüfung des Filterkriteriums bis zu den Blättern traversieren und dann den Index entsprechend umrechnen, so dass er die rausgefilterten Nodes ignoriert.
Hat hier jemand vielleicht eine performantere Lösung anzubieten? Caching ist natürlich eine Möglichkeit, wobei das bei großer Datenmenge doch schon ordentlich Speicher verbraten würde. Ich befürchte leider, das es aufgrund meiner Datenstruktur aber nicht anders machbar ist.
Viele Grüße
Zacherl