Entwickler-Ecke

Multimedia / Grafik - Treeview nodes-problem


robby_robbt - Mi 01.12.10 20:26
Titel: Treeview nodes-problem
Ich habe ein TreeView:

-A
-B
---C
-----D
---[E]
---F
-G
-H


Node E ist selected. Wie finde ich den Name von B heraus? Also der Knoten in dem sich E befindet?
Vielen Dank für Eure Antworten!
robby_robbt


jaenicke - Mi 01.12.10 21:19

Du kannst einfach so lange zum Parent des aktuellen Knotens gehen, bis du bei der ersten Ebene angekommen bist. ;-)


robby_robbt - Mi 01.12.10 21:40

:D Ups.
Danke trotzdem! Wie kann ich denn für jeden Knoten zum Namen den Namen vom Parent hinzufügen?


huuuuuh - Mi 01.12.10 21:54

hat nich jeder knoten diese eigenschaft? also .Parent? E.Parent wär in deinem Beispiel B ...
edit: grad nachgeschaut. Parent gibt es. TreeView.SelectedNode.Parent dürfte in deinem fall die TreeNode B zurückgeben


robby_robbt - Mi 01.12.10 22:00

In meiner TreeView ist ein Ordner mit seinen Unterordnern und dessen UNterordnern, etc.
Mein Ziel ist es den Pfad vom untersten Unterordner herauszufinden, indem ich:
den Namen vom Parent + den Namen des gerade seletierten Nodes zurückgebe, und erhalte so von allen Nodes den Pfad;)
Nur müsst ich dazu allen Nodes den Namen ändern. aber wie?


huuuuuh - Mi 01.12.10 22:05

könntest du mal ein konkretes beispiel machen? verstehe das grade nicht...


robby_robbt - Mi 01.12.10 22:10


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void UpdateChildren(TreeNode node)
        {
            foreach (TreeNode treeNode in node.Nodes)
            {
              node.Name = node.Text + ;
                UpdateChildren(treeNode);
            }
        }

geschafft. ;)

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void UpdateChildren(TreeNode node)
        {
            foreach (TreeNode treeNode in node.Nodes)
            {
              node.Name = node.Text + node.Parent.Text; <--hier gibts aber einen Fehler.. :/
                UpdateChildren(treeNode);
            }
        }


Moderiert von user profile iconNarses: C#-Tags hinzugefügt


huuuuuh - Mi 01.12.10 22:15

überleg mal, was Node.Parent für einen Wert hat, wenn Node der oberste Knoten ist, also gar keinen Parent hat ;)


robby_robbt - Mi 01.12.10 22:36


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
void Button1Click(object sender, EventArgs e)
    {
      TreeNode tn = tvList.TopNode;
      UpdateChildren(tn);
    }
    
private void UpdateChildren(TreeNode node)
    {
      if(node.Text != "Main") {
        foreach (TreeNode treeNode in node.Nodes)
        {
          node.Text = "" + node.Text + node.Parent.Text.ToString();
          UpdateChildren(treeNode);
          MessageBox.Show("" + node.Name);
        }
      } else if(node.Text == "Main") {
        node.Name = "" + Directory.GetCurrentDirectory();
      }
    }


Was mach ich bloß falsch?! :( grade eben ists noch gegangen..

Moderiert von user profile iconNarses: I- durch C#-Tags ersetzt


Yogu - Mi 01.12.10 22:58

Hm, fangen wir lieber nochmal mit dem Ablaufplan an:
  1. Ist der Knoten der Wurzelknoten?
    • Ja: Der Text soll das aktuelle Verzeichnis sein.
    • Nein: Der Text soll der Text des Parents plus der eigene Text sein.
  2. Führe Schritt 1 und 2 bei allen Kindknoten durch.
Schreib die Methode am besten nochmal neu. Übrigens kannst du mit node.Parent == null ganz einfach überprüfen, ob ein Knoten der Wurzelknoten ist.

Desweiteren sollte die Verwendung von Directory.GetCurrentDirectory() wohl überlegt sein. Ist sie das?

PS: Bitte schließe deine Quelltexte in <span class="inlineSyntax">{PROTECTTAGe2e40b88a3857f49745bb30a6bb9d732}</span> ein. Danke :)


robby_robbt - Mi 01.12.10 23:13


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
    void Button1Click(object sender, EventArgs e)
    {
      TreeNode tn = tvList.TopNode;
      UpdateChildren(tn);
    }
    
    private void UpdateChildren(TreeNode node)
    {

      if(node.Parent == null) {
        node.Name = "" + Directory.GetCurrentDirectory();
        foreach (TreeNode treeNode in node.Nodes)
        {
          tsslC4Manager.Text = node.Text;
          UpdateChildren(treeNode);
        }
      } else {
        foreach (TreeNode treeNode in node.Nodes)
        {
          tsslC4Manager.Text = node.Text;
          node.Name = node.Name + node.Parent.Text.ToString();
          UpdateChildren(treeNode);
        }
      }
    }

Hab es so versucht.. Tut mir leid, komm leider nicht viel weiter.. :(


jaenicke - Do 02.12.10 06:55

Wenn du da eine Ordnerstruktur darstellen willst:


robby_robbt - Do 02.12.10 15:30

also was ich habe:
-A
-B
---C
------D
------E
---F


was ich haben möchte: ^^
-A
-B
---BC
------BCD
------BCE
---BF


Also soll Jeder Knoten den Namen vom Parent-Knoten + den eigenen Namen hinten Dran haben.


huuuuuh - Do 02.12.10 16:31


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
void Button1Click(object sender, EventArgs e)
    {
      TreeNode tn = tvList.TopNode;
      UpdateChildren(tn);
    }
    
    private void UpdateChildren(TreeNode node)
    {

      if(node.Parent == null) {
        node.Name = Directory.GetCurrentDirectory();
        
        foreach (TreeNode treeNode in node.Nodes)
        {
          
          UpdateChildren(treeNode);
        }
      } else {
          tsslC4Manager.Text = node.Text;
          node.Name = node.Parent.Name + node.Name;
        foreach (TreeNode treeNode in node.Nodes)
        {
          
          UpdateChildren(treeNode);
        }
      }
      node.Text =node.Name;
    }

versuch mal so. gebe aber keine garantie, das es funktioniert :D


robby_robbt - Do 02.12.10 17:42

Danke hat funktioniert. ;)
Wie überprüfe ich eigentlich ob
-A
---B
---C
---D
A ein "Child-Node" enthält, dessen Namen "C" ist?


jaenicke - Do 02.12.10 17:49

Alle ChildNodes durchgehen und nachschauen?


Yogu - Do 02.12.10 20:48

user profile iconhuuuuuh hat folgendes geschrieben Zum zitierten Posting springen:
versuch mal so. gebe aber keine garantie, das es funktioniert :D

Naja, die Schleifen kann man aber auch zusammenpacken:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
void Button1Click(object sender, EventArgs e)
    {
      TreeNode tn = tvList.TopNode;
      UpdateChildren(tn);
    }
    
    private void UpdateChildren(TreeNode node)
    {
      if(node.Parent == null)
        node.Name = Directory.GetCurrentDirectory();
      else {
          tsslC4Manager.Text = node.Text;
          node.Name = node.Parent.Name + node.Name;
      }

      node.Text =node.Name;

      foreach (TreeNode treeNode in node.Nodes)
      {   
        UpdateChildren(treeNode);
      }
    }