Ist es richtig, dass es keine Möglichkeit gibt, einzelne Treenodes in einem Treeview auszublenden?
Ich will eine Filterfunktion realisieren. Ähnlich dem Startmenü in Vista oder den Lesezeichen im Firefox oder der Winamp-Lieder-Liste.
Um trotzdem Knoten ausblenden zu können könnte ich ja eine Kopie des vollständigen Rootnodes erstellen und dann im "Orginal" die einzelnen Nodes löschen. Gibts wirklich keine bessere Lösung?
Hallo Phaiax,
Original von Phaiax
Ist es richtig, dass es keine Möglichkeit gibt, einzelne Treenodes in einem Treeview auszublenden?
Stimmt.
Die Property Visible gibt es jedenfalls nicht.
mfg
webstarg
Hallo!
Du kannst dir die ausgeblendeten Nodes in einem Dictionary<TreeNode, List<TreeNode>> (Key = Parent-Node; List = Liste der ausgelendeten Subnode des Parents) merken und per remove aus dem TreeView entfernen. Wenn du die Nodes wieder hinzufügen willst, kannst du einfach mit dem Parent die ausgelendeten Subnodes im Dictionary wiederfinden, per parent.Add() wieder zum TreeView hinzufügen und aus der List<> entfernen (oder gleich den ganzen Dictionary-Eintrag, wenn du alle Subnodes einblenden willst).
mfg
@ DeveloperX: Die Reihenfolge ist dann aber futsch, oder?
webstarg
Das weiß ich leider auch nicht. Aber wenn du Glück hast, ändert sich bei Remove() der Index eines TreeNodes nicht. Dann kannst du den Node per Insert() an die richtige Position einfügen. Müsstest du halt mal testen.
Ansonsten kannst du dir ja den Index irgendwo merken, und dann ein den richtigen Index in der TreeNodeCollection suchen und dort einfügen.
Ich hätte nicht gedacht, dass eine kleine Filterfunktion so schwer werden könnte. Ich Hatte erst versucht, immer von einer Kopie des Orginalknotens die nicht benötigten Knoten zu löschen, aber dass ging nicht, da bei jedem löschen die Enumeration (foreach) verschoben wurde.
Jetzt hab ich eine for-Schleife gebaut, die das umgehen kann: Hier der Code, vielleicht kann er jemandem einen Denkanstoß bringen:
// erst Kind-Knoten durchgehen
for (int i = 0; i < Node.Nodes.Count; i++)
{
TreeNode ChildNode = Node.Nodes[i];
FilterNode(ChildNode);
if (ChildNode.Parent == null) // Gelöscht, d.h. Index verschiebt sich um eins nach oben
i--;
}
Hallo Phaiax,
soweit ich weiß, gibt es keine einfache Lösung. Ich würde mir entweder die gelöschten Nodes und den entsprechenden Index irgendwo merken, und dann ggf. wieder einblenden, oder auf einer Kopie arbeiten und dort die Nodes einfach entfernen.
Gruß,
Fabian
"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)
Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…
Blog: www.fabiandeitelhoff.de