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
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...
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)
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...
Hallo cyntonix,
TreeNodeCollection.Find sucht nach TreeNode.Name. Du verwendest als Suchbegriff aber TreeNode.Text.
herbivore
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.
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 😦
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
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...
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
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...