2009-05-29 5 views
1

Ich habe eine Anwendung entwickelt, die eine Baumansicht aus hierarchischen Daten in einer Datenbank auffüllt.So zeigen Sie nur ein TreeView-Erweiterungszeichen [+] an, wenn untergeordnete Elemente vorhanden sind

Ich habe es entworfen, um Lazy-Loading zu verwenden, so dass es nur die untergeordneten Knoten erhält, wenn ein Knoten erweitert wird.

Mein Problem ist, dass ich natürlich nicht weiß, ob ein Knoten Kinder hat, es sei denn ich einen Anruf an die Datenbank und schauen. Derzeit habe ich einen Dummy-Child-Knoten implementiert, so dass das Symbol [+] für alle Knoten erscheint. Ich entferne dann diesen Dummy-Knoten und erhalte die echten Kind-Knoten im BeforeExpand-Event.

Das bedeutet, ich bekomme ein [+] Symbol für Knoten, die keine untergeordneten Knoten haben, also klickt der Benutzer auf das Erweiterungssymbol und es gibt nichts, was ein bisschen schäbig aussieht.

Was ist die bevorzugte Methode für die Verarbeitung von untergeordneten Knoten in einer Lazy-Load-Baumansicht? Wenn ich einen Aufruf an die Datenbank mache, um zu sehen, ob es Kindknoten gibt, dann könnte ich genauso gut die Kindknoten laden und das Lazy Loading vergessen, oder?

Ein Gedanke, den ich hatte, war, ein "HasChildren" -Flag in der Datenbank zu speichern, so dass ich selektiv meinen Dummy-Kind-Knoten nur für die Knoten erstellen kann, die tun untergeordnete Knoten haben.

Sorry für Wandern auf, sie ist sehr daran interessiert zu sehen, was andere Leute denken ...

+0

BTW: Dies ist eine Treeview in Visual Studio 2005 –

Antwort

4

bekommen Wenn Sie einen Anruf tätigen, überprüfen Sie für die Kinder zusammen mit den Knotendaten:

SELECT tp.*, 
     (
     SELECT 1 
     FROM table tc 
     WHERE tc.parent = tp.id 
     LIMIT 1 
     ) AS has_children 
FROM table tp 

Sie müssen nicht zählen, kann es lange dauern.

Überprüfen Sie, ob mindestens ein Kind vorhanden ist.

+0

Chapeau für dieses sehr einfache und einfache Skript! Wenn Sie nicht untergeordnete Elemente herausfiltern müssen, fügen Sie am Ende 'HAVING has_children = 1' hinzu – Mateng

1

Änderung Ihre ursprüngliche Abfrage alle die gleichen Daten zurück, aber auch eine Anzahl von Kindern. Wenn die Kinder nicht zählen, zeige die [+]. Posten Sie Ihr Schema und Abfrage für die Hilfe der Zählung

1

Meine bevorzugte Lösung für dieses Problem ist die Implementierung vor-geordneter Baum Traversal auf Ihrer Reihe von hierarchischen Daten. Eine Beispielimplementierung finden Sie unter http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/.

Der Punkt ist, dass, wenn Sie einen linken und rechten Wert für jeden Knoten pflegen, wenn der linke Wert und der rechte Wert sich um mehr als eins unterscheiden, dieser Knoten Kinder hat.

Der einzige bemerkenswerte Nachteil dieses Ansatzes ist, dass Sie diese linken und rechten Werte aktiv beibehalten müssen, wenn Sie die Struktur der Knoten ändern.

Verwandte Themen