Announcement

Collapse
No announcement yet.

Childnode eines TreeView selektieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Childnode eines TreeView selektieren

    Hallo

    Ich habe ein Problem, welches ich mit Hilfe von der einschlägigen Suchmaschine leider nicht lösen konnte.

    Ich habe ein TreeView, welches ich dynamisch mit Werten aus einer Datenbank fülle.

    Wenn ich auf einen bestimmten Button klicke, möchte ich, dass eine bestimmte Childnode des TreeView selektiert wird.

    Mein bisheriger Ansatz ist folgender:

    Code:
       TreeNode tn = treeView.Nodes["meinText"];
                treeView.SelectedNode = tn;
                treeView.Select();
    Damit wird schonmal die gewünschte ParentNode selektiert. Wenn ich jetzt aber folgendes versuche:

    Code:
     TreeNode tn = treeView.Nodes["Computer"].Nodes[2];
                treeView.SelectedNode = tn;
                treeView.Select();
    kommt der Fehler: "... wurde nicht auf eine Objektinstanz festgelegt." Das heißt, er findet die Childnode nicht.

    Hab ich hier einen Denkfehler oder ist der Ansatz komplett falsch?

    Für Hilfe wäre ich wie immer dankbar

  • #2
    Es weiss leider keiner wie Dein Tree aussieht bzw. was davon wirklich im Speicher abgebildet ist. Ich denke da braucht man etwas mehr Info wie z.B. der ganze Baum aussieht....

    Comment


    • #3
      TreeNode tn = treeView.Nodes["Computer"].Nodes[2];
      Woher weißt du das du einen "Computer" - Knoten hast. Und woher weißt du das dieser mindestens 3 Childnodes hast?

      Man kann nicht sagen wo dein Fehler liegt was auf jeden Fall nicht gut ist das du deine Annahmen nicht prüfst!

      a.) Prüfen ob - treeView.Nodes["Computer"] - existiert.
      b.) Prüfen wieviele Childnodes dieser Knoten hat.
      c.) und nur dann auf einen Node bzw. dessen Properties zugreifen wenn dieser auch existiert.

      Comment


      • #4
        Hallo und danke schonmal für eure Antworten.

        Also ich weiß, dass ich einen "Computer"-Knoten habe, da es ja auch funktioniert, wenn ich praktisch nur die ParentNode auswähle über:

        Code:
        treeView.SelectedNode = treeView.Nodes["Computer"]
        Aber auf die Subnodes komme ich nicht drauf.
        Ich werde mal prüfen, ob er zu dem Zeitpunkt schon Subnodes hat.

        EDIT:
        Also ich habe es jetzt nacheinander probiert, erst die "Computer"-Node, danach die ChildNode, die ich haben möchte. Dabei habe ich folgendes festgestellt:

        Wenn ich schreibe:
        Code:
        TreeNode tn = treeView.Nodes[0];
                    TreeNode cn = tn.Nodes[1];
                    MessageBox.Show(cn.Text);
        dann gibt er mir den Namen der gewünschten Subnode aus.

        Allerdings bei:
        Code:
        TreeNode tn = treeView.Nodes["MainNode"];
                    TreeNode cn = tn.Nodes["SubNode"];
                    MessageBox.Show(cn.Text);
        funktioniert das nicht und er findet das Element nicht.

        Kann es sein, dass ich die Nodes falsch adressiere? Ich weiß ja von vornherein nicht, welchen Index die spezielle TreeNode hat, auf die ich zugreifen will.
        Zuletzt editiert von monik.; 07.03.2011, 15:14. Reason: nach Test

        Comment


        • #5
          Du könntest auch mal ein

          [highlight=c#]
          var selectedNode = treeView.Nodes.Where(x => x.Text == "Computer").First();
          [/highlight]

          probieren. Sofern für die TreeNodeCollection (oder wie auch immer das Ding heisst) die LINQ Extensions verfügbar sind Ansonsten vorher halt noch irgendwie in einen Typ umwandeln mit dem LINQ was anfangen kann.

          Comment


          • #6
            Habe auch dies probiert - es funktioniert leider nicht Ich verwende ja gar kein LinQ in meinem Programm.

            Comment


            • #7
              also ich habe jetz eine Lösung für mein Problem gefunden. Zwar nicht die gewünschte, aber so komme ich auch zum Ziel.

              Meine gewünschte Childnode platziere ich einfach an die erste Stelle im ersten Knoten (Computer) und mache dann folgendes:

              Code:
              treeView.Select();
                          TreeNode tn = treeView.Nodes[0].FirstNode;
                          
                          treeView.SelectedNode = tn;
              Das hat nämlich auch nicht funktioniert, als das treeView.Select(); noch nach dem Setzen des Childnodes eingefügt war.

              Komisch, warum das nicht geht. Mit Intellisense und der Beschreibung wird ja angezeigt, dass man die Nodes per Index oder per Text adressieren kann. Aber weder bei der ParentNode noch bei der Childnode funktioniert das. Kann das mal jemand von euch ausprobieren? Vielleicht hab ich auch einfach nur nen gewaltigen Klemmer?

              Vielen Dank vorerst
              monik.

              Comment


              • #8
                Und warum geht LINQ nicht? Warum verwendest Du es nicht? Zumindest die Extension Methoden sind auf Collections sehr sehr hilfreich.

                Comment


                • #9
                  Du bist dir sicher das du auch einen Node mit dem gesuchten Namen (nicht "Text") hast? Die Nodes Collection geht auf die Name Property wenn du den String Indexer verwendest.

                  Wenn du fanderlfs LINQ Ausdruck ausprobiert hast sollte es eigentlich gehen falls du Text und Name verwechselt hast. Denn er geht ja explizit auf die Text Property wobei du immer auf den Namen prüfst.

                  Comment


                  • #10
                    Danke für Eure Hinweise.

                    Ich verwende LinQ deswegen nicht, weil ich davon erst erfahren habe, als ich mit meinem Programm schon relativ weit war und nicht nochmal ganz von vorn beginnen wollte - da mir dazu ausserdem die Zeit fehlt.

                    Als ich das mit dem LinQ probiert habe, mir das IntelliSense gar nicht das
                    treeView.Nodes.Where... angezeigt. Deswegen habe ich die Idee erstmal verworfen (habe des Namespace eingebunden!)

                    Der Tip mit Name und Text ist gut, doch wenn ich auf
                    Code:
                    treeView.Nodes["xxx"].Nodes["xxx"]
                    gehe, kann ich ja schlecht wählen, ob ich Text oder Name habe. Denn entweder man gelangt über den Index (int) oder über den Key (string) auf die ChildNode.

                    Comment


                    • #11
                      kann ich ja schlecht wählen,
                      Da gibt es auch nichts zu wählen. Key ist der Name des Nodes nicht der (Anzeige)Text. Also solltest du auch nach dem Namen suchen. Der (Anzeige)Text hat hier keine Bedeutung.

                      Comment


                      • #12
                        Ok, wir kommen der Sache näher.

                        Ich habe jetzt mal eine TreeNode ausgewählt und mir über ne MessageBox den Namen anzeigen lassen - da steht nix drin.

                        Hmpf...wie kriegen meine Nodes denn Namen?

                        Comment


                        • #13
                          Hmpf...wie kriegen meine Nodes denn Namen?
                          Die haben eine Name Property. Wofür könnte die wohl gut sein

                          Comment


                          • #14
                            Man könnte auch einfach LINQ verwenden und verstehen... dann könnte man sich das ganze Brimborium sparen

                            Comment


                            • #15
                              Originally posted by Ralf Jansen View Post
                              Die haben eine Name Property. Wofür könnte die wohl gut sein
                              Ja, das ist mir schon klar. Mein TreeView wird ja dynamisch zur Laufzeit erstellt. Und ich habs ja geprüft - die TreeNodes haben keine Namen!

                              LinQ würde ich gern verwenden - habe aber dafür keine Zeit mir das jetzt noch anzueignen, weil das Tool praktisch schon "vorgestern" hätte fertig sein müssen und ich zur Zeit eh nur am suchen und probieren bin, wie ich was umsetzen kann. (da fehlt leider die Modellierungs- und Programmiererfahrung )

                              Comment

                              Working...
                              X