Benutzer mit den meisten Antworten
Entity Tree Node in eine Variable schreiben, um ihn nach dem Neuaufbau des Trees wieder zu selektieren

Frage
-
Hallo zusammen,
ich beschäftige mich seit ein paar Monaten mit dem Thema. Ich hänge seit Tagen an einem Problem, ich hoffe ihr könnt mir helfen.
Meine Ausgangssituation ist:
Ich habe eine TreeView mit einer 3-stufigen Struktur. Es ist immer ein Node ausgewählt. Hierbei spielt es keine Rolle, auf welcher Ebene der "selected" Node befindet. Soweit so gut.
Nun löse ich die TreeView auf (clear) und baue sie wieder auf. (fragt nicht warum :-) Dabei möchte ich den vor der Auflösung ausgewählten Node wieder als selected markieren. Wie bekomme ich das hin?
Folgendes habe ich bereits ausprobiert:
1. Ich schreibe den Index des ausgewählten Nodes in eine Variable:
slnd = treNavigation.Nodes.IndexOf(treNavigation.SelectedNode);
Und markiere den Node zum Schluss wieder als selected:
treNavigation.Nodes[slnd].Select();
Das funktioniert aber nur mit der obersten Ebene, denn nur dort sind die Indizes eindeutig. (0, 1, 2, 3, 4) Sollte aber ein Node auf der zweiten oder dritten Ebene ausgewählt sein, wird mir komischerweise als Index immer -1 geliefert, den ich zum Schluss nicht einlesen kann. Was mache ich falsch?
2. Ich habe noch versucht, mit selectedvalue weiterzukommen. Aber da dieser Wert nur "read-only" ist, bringt er mir auch nichts.
Habt ihr Ideen, was ich hier noch machen könnte?
Vielen herzlichen Dank.
- Verschoben Tom Lambert (Koopakiller)Moderator Donnerstag, 29. August 2013 18:40
Antworten
-
Hallo ihr beiden,
danke für die Lösungen. In der Zwischenzeit habe ich eine andere Lösung gefunden. Es funktioniert wunderbar mit findnode, wie folgt:
Ich definiere die Variable:
String selnodeval = treNavigation.SelectedNode.ValuePath;
Und suche mit findnode danach und selektiere den Node:
treeview.FindNode(selnodeval).Select();
Grüße,
ghun
- Als Antwort markiert Ciprian Bogdan Mittwoch, 4. September 2013 16:02
Alle Antworten
-
Hallo,
Wenn du mittels IndexOf -1 zurück bekommst, dann ist kein Knoten dieser Ebene markiert. Also musst du alle Elemente der 2. Ebene durchgehen und dort je mittels IndexOf das markierte Element abfragen. Ggf. auch noch bei der Dritten. Bei 3 Ebenen brauchst du also 3 Variabnlen, welche den Wert abspeichern.
Beim wieder zuweisen musst du dann wieder gespeicherten Index nach und anch durchgehen und entsprechend wieder zuweisen.
int i1 = -1, i2 = -1, i3 = -1; i1 = tv.Nodes.IndexOf(tv.SelectedNode); if(i1==-1) { //Alle Elemente 2. Ebene durchgehen und dann i1 und i2 zuweisen if(i2==-1) { //Alle Elemente 3. Ebene durchgehen und dann i1 und i2 und i3 zuweisen } }
//Laden if(i2!=-1) { if(i3!=-1) { //Item 3. ebene } else { //Item 2. ebene } } else { //Item 1. Ebene }
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Bearbeitet Tom Lambert (Koopakiller)Moderator Donnerstag, 29. August 2013 18:40 WP -> WinForms
-
Hi,
nachfolgend ein Beispiel für eine Möglichkeit, wie man Dein Problem lösen kann:using System; using System.Collections.Generic; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } TreeView tv = new TreeView() { Dock = DockStyle.Fill, HideSelection = false }; Button btn = new Button() { Dock = DockStyle.Top, Text = "Neu laden" }; List<C1> liste = new List<C1>(); Random rnd = new Random(); int index = 0; int selectedIndex = 0; MyTreeNode selectedNode = null; private void Form1_Load(object sender, EventArgs e) { this.Controls.AddRange(new Control[] { tv, btn }); ListeFuellen(liste, 1); TreeAnzeigen(tv.Nodes, liste); tv.ExpandAll(); btn.Click += btn_Click; } void btn_Click(object sender, EventArgs e) { selectedIndex = ((MyTreeNode)tv.SelectedNode).NodeIndex; tv.Nodes.Clear(); TreeAnzeigen(tv.Nodes, liste); tv.SelectedNode = selectedNode; tv.ExpandAll(); } void TreeAnzeigen(TreeNodeCollection tnc, List<C1> l) { foreach (var item in l) { MyTreeNode tn = new MyTreeNode(item.Text) { NodeIndex = item.Index }; tnc.Add(tn); if (item.Index == selectedIndex) selectedNode = tn; if (item.Childs != null) TreeAnzeigen(tn.Nodes, item.Childs); } } void ListeFuellen(List<C1> l, int level) { for (int i = 0; i < rnd.Next(5, 10); i++) { index++; C1 item = new C1() { Index = index, Text = "Knoten " + index.ToString() }; l.Add(item); if (rnd.NextDouble() < 0.5 / level) { item.Childs = new List<C1>(); ListeFuellen(item.Childs, level + 1); } } } internal class C1 { internal int Index { get; set; } internal string Text { get; set; } internal List<C1> Childs { get; set; } } internal class MyTreeNode : TreeNode { public MyTreeNode(string text) : base(text) { } internal int NodeIndex { get; set; } } } }
--
Peter -
Hallo ihr beiden,
danke für die Lösungen. In der Zwischenzeit habe ich eine andere Lösung gefunden. Es funktioniert wunderbar mit findnode, wie folgt:
Ich definiere die Variable:
String selnodeval = treNavigation.SelectedNode.ValuePath;
Und suche mit findnode danach und selektiere den Node:
treeview.FindNode(selnodeval).Select();
Grüße,
ghun
- Als Antwort markiert Ciprian Bogdan Mittwoch, 4. September 2013 16:02
-
Hi,
der Nachteil Deiner Lösung besteht darin, dass nach dem Neuladen des Trees der ehemals selektierte Knoten an einer anderen Stelle sein kann und dann nicht selektiert werden kann. Es gibt ja einen Grund, warum der Tree gelöscht wird, z.B. Knoten verschieben, andere Daten in der Datenbank usw.--
Peter -
Es freut uns, dass Du Dein Problem lösen konntest und danke, dass Du Deine Lösung hier im Forum gepostet hast. Jetzt können auch andere die das gleiche Problem haben unter Umständen davon profitieren.
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.