Laden...

Treeview: Selection geht nicht

Erstellt von cyntonix vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.922 Views
C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 13 Jahren
Treeview: Selection geht nicht

Hallo,

nach ewiger Suche bei Google und hier im Forum frage ich einfach mal 😃
Ich habe einen Treeview mit Nodes. Die markierte Node soll gespeichert werden. Nun lösche ich alle Nodes aus dem Treeview und fülle ihn mit den gleichen Nodes (test).
Die gespeicherte (alte) Node soll nun ausgewählt werden.
Leider passiert ... garnix. Beim debuggen sieht aber alles korrekt aus.
Hab schon verschiedene Möglichkeiten durchgespielt:

1.


            TreeNode oldSelectedNode = tvDateien.SelectedNode;
            // Löschen und wieder befüllen
            tvDateien.SelectedNode = oldSelectedNode;


            string oldSelectedNode = tvDateien.SelectedNode.FullPath;
            Suchen("");
            foreach (TreeNode node in tvDateien)
            {
                if (node.FullPath == oldSelectedNode)
                {
                    tvDateien.SelectedNode = node;
                }
            }

Danke schon mal!
Gruß
cyn

4.221 Beiträge seit 2005
vor 13 Jahren

Dein Problem ist, dass Du nur auf der obersten Eben im Baum suchst...

du müsstest rekursiv suchen (node.Nodes)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 13 Jahren

habs nun mal so probiert:


           oldSelectedNode = tvDateien.SelectedNode.Text;
           
// Löschen und wieder hinzufügen von allen Nodes

            TreeNode[] tn = tvDateien.Nodes[0].Nodes.Find(oldSelectedNode, true);
            for (int i = 0; i < tn.Length; i++)
            {
                tvDateien.SelectedNode = tn[i];
                tvDateien.SelectedNode.BackColor = Color.Yellow;
            }

passiert garnix ...
Im Array sind auch keine Elemente... er findet also nix ... (Node ist aber vorhanden)

916 Beiträge seit 2008
vor 13 Jahren

Wenn du an den neu Hinzugefügten Nodes ein select mit der alten Node machst, dann ist doch logisch dass das nicht geht. Du brauchst einen ident, weil die neu erzeugte Node hat doch einen anderen HashCode als die alte. Also musst du dir an deine TreeNode ne Art Id bauen, z.B. an das Tag Property. Und beim selektieren, alle Nodes durch laufen, und schauen ob eine dabei ist die die gleiche Id hat.

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo cyntonix,

TreeNodeCollection.Find sucht nach TreeNode.Name. Du verwendest als Suchbegriff aber TreeNode.Text.

herbivore

5.299 Beiträge seit 2008
vor 13 Jahren

jepp. Ein entsprechendes Hinweislein findet sich in den Remarks der MSDN zur Treenode.Name-Property, aber leider nicht als Remarks-Code-Dokumentations-Tag.
.Name ist also die Property, dafür vorgesehen, die von rollerfreak vorgeschlagene ID aufzunehmen - nicht die .Tag-Property.

Der frühe Apfel fängt den Wurm.

C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 13 Jahren

Ok. Danke erstmal an alle für die Hilfe.
Nun ist es aber so:
wenn ich auf den Button drücke, der die Notes entfernt und hinzufügt dann steht in TreeView.SelectedNode.Name nix (""). Warum?
ich durchlaufe alle Nodes und dann frag ich sie ab:


            foreach (TreeNode node in tvDateien.Nodes)
            {
                node.Name = node.FullPath;
            }

            oldSelectedNode = tvDateien.SelectedNode.Name;

            // Nodes Löschen & Hinzufügen

            TreeNode[] tn = tvDateien.Nodes[0].Nodes.Find(oldSelectedNode, true);
            for (int i = 0; i < tn.Length; i++)
            {
                tvDateien.SelectedNode = tn[i];
                tvDateien.SelectedNode.BackColor = Color.Yellow;
            }

Problem ist das (string) oldSelectedNode leer ist 😦

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo cyntonix,

du musst in Name halt selbst eine ID bzw. einen passenden Wert reinschreiben.

Es weniger Nachfragen und etwas mehr Eigeninitiative wäre nicht schlecht. Wir geben ja gerne Schubser in die richtige Richtung, aber das sollte dann auch reichen.

herbivore

4.221 Beiträge seit 2005
vor 13 Jahren

Es weniger Nachfragen und etwas mehr Eigeninitiative wäre nicht schlecht. Wir geben ja gerne Schubser in die richtige Richtung, aber das sollte dann auch reichen.

Da muss ich herbivore leider Recht geben.

Man kann anhand des FullPath den Node sogar ohne Rekursion finden.

Hier ein kleines Beispiel: (Form mit 1 Button zum Füllen und einen TreeView)



        private void button1_Click(object sender, EventArgs e)
        {
            this.treeView1.Nodes.Clear();
            this.treeView1.Nodes.Add("Zürich");
            this.treeView1.Nodes.Add("Basel").Nodes.Add("Bahnhofstrasse").Nodes.Add("Müller");
            this.treeView1.Nodes.Add("Bern").Nodes.Add("Hauptstrasse");
        }

        
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.treeView1.AfterSelect -= new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
            try
            {
                TreeNode ndOld = e.Node;
                string oldFullPath = ndOld.FullPath;

                this.treeView1.Nodes.Clear();
                this.treeView1.Nodes.Add("Zürich");
                this.treeView1.Nodes.Add("Basel").Nodes.Add("Bahnhofstrasse").Nodes.Add("Müller");
                this.treeView1.Nodes.Add("Bern").Nodes.Add("Hauptstrasse");

                //suche den Node zu oldFullPath
                string[] stringParts = oldFullPath.Split(@"\\".ToCharArray());

                TreeNodeCollection nodes = this.treeView1.Nodes;
                string strFound = string.Empty;
                foreach (string s in stringParts)
                {
                    if (strFound == string.Empty)
                    {
                        strFound = s;
                    }
                    else
                    {
                        strFound = string.Join(@"\", new string[] { strFound, s });
                    }
                    foreach (TreeNode nd in nodes)
                    {
                        if (nd.FullPath.StartsWith(strFound))
                        {
                            if (nd.FullPath == oldFullPath)
                            {
                                this.treeView1.SelectedNode = nd;
                                return;
                            }
                            else
                            {
                                nodes = nd.Nodes;
                            }
                            break;
                        }
                    }
                }
            }
            finally
            {
                this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
            }
        }

PS: ich habe hier nur geholfen weil ich es immer wieder interessant finde in einer Hierarchie etwas ohne Rekursion zu finden 😃

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 13 Jahren

Danke an alle für die Hilfe!
(Mir sind Denkanstöße lieber, da der Lerneffekt höher ist. Dennoch hab ich nicht genau gewusst wie ich ansetzen soll).

Nun funktioniert das ganze. Aber ich frage mich warum meine Lösung nicht funktioniert hat... denn normalerweise ist doch der Fullpath dann gleich aber ich bekam kein true... warum?

Danke noch mal!
Gruß
cyn

4.221 Beiträge seit 2005
vor 13 Jahren

Aber ich frage mich warum meine Lösung nicht funktioniert hat... denn normalerweise ist doch der Fullpath dann gleich aber ich bekam kein true... warum?

Hatte ich in meinem ersten Post schon geschrieben: Treeview: Selection geht nicht

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...