Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

TcxVirtualTreeList auf Datenebene filtern?

  Alt 28. Jul 2017, 00:23
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat