none
Entity Tree Node in eine Variable schreiben, um ihn nach dem Neuaufbau des Trees wieder zu selektieren RRS feed

  • 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.

    Donnerstag, 29. August 2013 14:35

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
    Dienstag, 3. September 2013 11:35

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.


    Donnerstag, 29. August 2013 18:38
    Moderator
  • 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
    Donnerstag, 29. August 2013 18:47
  • 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
    Dienstag, 3. September 2013 11:35
  • 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

    Dienstag, 3. September 2013 15:57
  • Hi,

    Du hast Recht. Aber für mich reicht es. Der einzige Grund warum ich den Tree neu lade ist, dass die Icons der einzelnen Elemente sich ändern können. Ansonsten ändert sich nichts.

    Mittwoch, 4. September 2013 09:59
  • 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-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Mittwoch, 4. September 2013 16:02