Childnode eines TreeView selektieren

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Childnode eines TreeView selektieren

    Hallo an Alle,

    ich verwende in meiner Anwendung einen Treeview welcher aus Haupt- und Unterknoten besteht. Darüber hinaus habe ich zwei Buttons btn_vorige_Maske und btn_nächste_Maske. Durch das Klicken auf die Buttons kann ich durch meine Anwendung klicken und dient als Alternative zum Treeview_Afterselect Ereignis. Wenn ich nun auf die Buttons klicke würde ich gern wollen, dass auch die entsprechenden nodes selektiert werden. Ich habe jetzt schon eine Weile rumprobiert. Es wird entweder der Parentnode selektiert oder ich bekomme eine Fehlermeldung. Wie kann man die Childnodes selektieren?

    Quellcode

    1. treeView1.SelectedNode = treeView1.Nodes("Start") 'Das funktioniert, da es den Parentnode darstellt, der Node Start wird blau markiert
    2. treeView1.SelectedNode = treeView1.Nodes("Start").Nodes("Maske_2") 'für ein entsprechenden Node in zweiter Hierarchie funktioniert das nicht


    Über eine Antwort würde ich mich sehr freuen.
    Viele Grüße
    TOYY1
    @toyy1 Teste mal dies:

    C#-Quellcode

    1. TreeNodeCollection nodes = this.treeView1.Nodes;
    2. this.treeView1.SelectedNode = nodes[3];
    3. this.treeView1.SelectedNode.Expand();
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Abend RodFromGermany,

    vielen Dank für deine Antwort. Leider erziele ich nicht den gewünschten Effekt.

    VB.NET-Quellcode

    1. Private Sub btn_next_page_Click(sender As Object, e As EventArgs) Handles btn_next_page.Click
    2. Try
    3. If KnotenName = "Start" Then
    4. TabCon_Main.SelectedTab = tp_b
    5. KnotenName = "Maske1"
    6. ElseIf KnotenName = "Maske1 Then
    7. TabCon_Main.SelectedTab = tp_c
    8. KnotenName = "Maske2"
    9. 'TreeView1_Main.SelectedNode = TreeView1_Main.Nodes("Sart") '.Nodes("Maske1").Nodes("Maske2")
    10. 'TreeView1_Main.SelectedNode = TreeView1_Main.Nodes("Start")
    11. 'TreeView1_Main.SelectedNode = TreeView1_Main.Nodes("Maske1")
    12. 'TreeView1_Main.SelectedNode = TreeView1_Main.Nodes("Maske2")
    13. 'TreeView1_Main.Select()
    14. Dim nodes As TreeNodeCollection = Me.TreeView1_Main.Nodes
    15. Me.TreeView1_Main.SelectedNode = nodes(0)
    16. Me.TreeView1_Main.SelectedNode.Expand()


    Vielleicht sollte ich mal ein Beispielprojekt hochladen - wäre das hilfreicher.
    Vielen Dank und viele Grüße
    TOYY1
    Guten Abend ErfinderDesRades,

    vielen Dank für deine Antwort. So sollte es funktionieren... Ich kenne dieses Beispiel bereits, da auch ich die Reiter ausblenden wollte :-). Leider wird SelectedIndex nicht von TreeView unterstützt, sondern es gibt die SelectedNode Möglichkeit, womit ich wieder bei meiner Fraegstellung wäre wie man auf ein Child zugreift?

    Viele Grüße
    Frank
    Definiere

    toyy1 schrieb:

    dass auch die entsprechenden nodes selektiert werden.
    Mein Beispiel macht dies:
    ==>
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Rod,

    also ich möchte folgendes erzeugen... Zur Zeit funktioniert, dass ich durch meine Masken switchen kann, nur leider wird der entsprechende Node nicht markiert und ich würde gern wollen, dass man sieht auf welcher Maske man sich befindet. Ich hoffe das folgende Bild verdeutlicht mein Anliegen.

    GUt wenn ich jetzt wüsste wie ich ein gespeichertes Bild von meiner Festplatte hier hochlade...

    toyy1 schrieb:

    vielen Dank für deine Antwort. So sollte es funktionieren... Ich kenne dieses Beispiel bereits, da auch ich die Reiter ausblenden wollte :-). Leider wird SelectedIndex nicht von TreeView unterstützt, sondern es gibt die SelectedNode Möglichkeit...
    Ja, aber wie habe ich das denn geschafft? - da ist doch was mit einem Treeview-Frameset, was funzt!
    Ich habe alle Beispiele von dir herunter geladen (onheReiter und TreeviewFrameset). Ich weiß leider nicht wie man hier ein Bild hochlädt, da wenn ich auf "Bild" klicke vb.paradise eine URL von mir wissen möchte. Ich denke mit dem Bild was ich vorbereitet habe wird klar was ich machen möchte. Zur Vollständigkeit: Ich habe ein TabControl und ein TreeView. Dank deines Codes sind die Tabs nicht sichtbar und zur Laufzeit ist der TreeView mit dem TabControl durch das AfterSelect Ereignis verknüpft, so dass ich wie in deinem Beitrag beschrieben:

    ​Mittm TabControl kann man die Funktionalität einer komplexen Anwendung in sinnvolle übersichtliche Einheiten strukturieren, ohne dass man viele Dialoge aufpoppen lassen müsste.Gelegentlich will man sich aber auch sowas wie einen Assistenten basteln, also eine Anwendung, die eine Ansicht nach der anneren nacheinander präsentiert, und wo man vor- und zurück-navigieren kann - Assistenten-Navigation.


    durch klicken auf die Nodes im Treeview unterschiedliche Tabs ansteuere. Nun habe ich zusätzlich einen Vor-/Zurück Buttons implementiert und möchte nun durch die einzelnen nicht sichbaren Tabs klicken. Das funktioniert. Was nicht funktioniert ist, dass der entsprechende Node des TreeViews blau markiert dargestellt wird.
    Zum Problem: Na da musst du halt, wenn du auf einen Navigier-Button klickst, nicht direkt die Tabpage ansteuern (und den TV vergessen), sondern du musst die TV-Nodes durchsuchen, und den richtigen Node dann Selected setzen.
    In weiterer Logik folgt dann ja auch das TabControl.
    Hallo zusammen,

    ich habe ein ähnliches Beispiel hier im Forum gefunden wo nach einen Knoten im TreeView gesucht wird. Ich probiere nun schon eine ganze Weile rum, aber ich weiß ehrlich gesagt nicht welche Eigenschaft ich auslesen soll. Ich habe Index und GetNodeCount probiert... Ich komme zu keiner Lösung.

    VB.NET-Quellcode

    1. Private Function FindeKnoten(ByVal Text As String, ByVal Nodes As TreeNodeCollection) As Integer
    2. Dim node_no As Integer
    3. For Each lnode As TreeNode In Nodes
    4. If lnode.Text = Text Then
    5. node_no = lnode.GetNodeCount(True)
    6. Return node_no
    7. Else
    8. If FindeKnoten(Text, lnode.Nodes) Then
    9. node_no = lnode.GetNodeCount(True)
    10. Return node_no
    11. End If
    12. End If
    13. Next
    14. Return -1
    15. End Function


    Könnte mir bitte jemand noch eine Hilfestellung geben?
    Vielen Dank.

    toyy1 schrieb:

    ich weiß ehrlich gesagt nicht welche Eigenschaft ich auslesen soll.
    Was soll denn übereinstimmen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    sondern du musst die TV-Nodes durchsuchen, und den richtigen Node dann Selected setzen.


    Ich muss die entsprechende Knotennummer auslesen und übergeben, so dass ich im Nachgang den Node selektieren kann.
    Bilder
    • Nodes im TreeView.jpg

      152,83 kB, 2.173×436, 265 mal angesehen
    @toyy1 Den nächsten Knoten zu selektieren hab ich mal implementiert:
    Spoiler anzeigen

    C#-Quellcode

    1. private void btnNext_Click(object sender, EventArgs e)
    2. {
    3. TreeNode node = null;
    4. if (this.treeView1.SelectedNode == null)
    5. {
    6. node = this.treeView1.Nodes[0];
    7. }
    8. else
    9. {
    10. node = this.treeView1.SelectedNode;
    11. if ((node.Nodes != null) &&
    12. (node.Nodes.Count > 0))
    13. {
    14. node = node.Nodes[0];
    15. }
    16. else
    17. {
    18. node = this.treeView1.SelectedNode.NextNode;
    19. TreeNode node2 = this.treeView1.SelectedNode.Parent;
    20. while ((node == null) &&
    21. (node2 != null))
    22. {
    23. if (node2 != null)
    24. {
    25. node = node2.NextNode;
    26. if (node == null)
    27. {
    28. node2 = node2.Parent;
    29. }
    30. }
    31. if (node != null)
    32. {
    33. node2 = node.Parent;
    34. }
    35. }
    36. }
    37. }
    38. if (node == null)
    39. {
    40. MessageBox.Show("Durch");
    41. }
    42. else
    43. {
    44. this.treeView1.SelectedNode = node;
    45. this.treeView1.SelectedNode.Expand();
    46. }
    47. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Abend RodFromGermany,

    was soll ich sagen - ich bin sprachlos :) . Dein Code funktioniert genauso wie ich es mir vorgestellt habe. VIELEN VIELEN DANK! Da wäre ich im Leben nicht drauf gekommen. Wie kommt man denn auf sowas? Ich habe hier 3 dicke Bücher über VB.Net, aber in keinem wird so eine Fragestellung aufgegriffen wie ich sie gesucht habe. Wie lange machst du sowas schon bzw. wie kommt man soweit wie du, um solche Problemstellungen zu lösen? Ich bin begeistert davon und von mir enttäuscht, da ich das nie hinbekommen hätte :( .

    Ich schaue mir jetzt deinen Code an und versuche Zeile für Zeile nachzuvollziehen.
    Nochmals vielen Dank an Dich und einen schönen Abend.

    Viele Grüße
    TOYY1

    toyy1 schrieb:

    versuche Zeile für Zeile nachzuvollziehen.
    Du könntest Rod auch um etwas Kommentation bitten.
    Der Algo ist nicht trivial, da wäre die eine oder andere Erklärung durchaus angebracht.

    Etwa ungewöhnlich scheint mir (wenn ich richtig lese), dass der Algo nicht das nächste Blatt sucht, sondern auch durchaus auf übergeordneten Ebenen hängenbleiben kann.
    Zumindest für meine Tab-Navigation wäre das ungeeignet, weil bei mir die Tabs prinzipiell nur mit Blatt-Nodes verknüpft sind.
    Oder vlt. wärs doch geeignet - wenn ich mich recht erinnere habich einen Automatismus eingebaut, dass der Treeview automatisch das erste Blatt aufsucht, wenn ein InnerNode gewählt wird.

    Und auf sowas kommt man, wenn man sich mit beschäftigt, auch auf etwas abstrakterer Ebene.
    Son Treeview ist eine typische Baumstruktur, solch kommt immer mal wieder vor inne Programmierung.
    Und wenn man sich die Prinzipien einer Baumstruktur klar macht, kommt man auch auf Ideen, wie man in sowas navigieren muss:

    Bei einem Baum hat jeder Node keine bis viele ChildNodes - das ist im Kern die Definition einer Baumstruktur.

    Daraus ergibt sich sofort, dass jeder ChildNode einen ParentNode hat.
    Und man kann noch weitere Fachbegriffe ableiten, wenn man die Nodes genauer betrachtet:
    ZB gibts da die TopLevelNodes, das sind Nodes auf oberster Ebene, die haben logischerweise keinen ParentNode
    Existiert nur genau ein einziger ToplevelNode, so spricht man vom RootNode.
    In die andere Richtung gibts auch besondere Nodes, nämlich diejenigen auf unterster Ebene, welche keine weiteren ChildNodes haben - das sind die sog. Blätter des Baums.
    Der vollständigkeit halber bezeichne ich noch die "normalen" Nodes, also diejenigen, die sowohl Parent als auch ChildNodes haben - als InnerNodes.

    So - mit diesen Abstrakta müssteste eiglich besser verstehen können, was in Rods Code passiert, wie er zum NextNode kommt, und wenns den nicht gibt, dann halt auf einer Ebene darüber nach dem NextNode sucht.
    Guten Abend ErfinderDesRades,

    vielen Dank auch an Dich und der sehr ausführlichen Erläuterung... Ich könnte Rod bitten den Code zu kommentieren, da gebe ich dir Recht. Aber ich habe bereits in anderen Fragestellungen gelsen, dass dann ein anderer User geschrieben hat das es an Faulheit grenzt nun auch noch die einzelnen Zeilen zu erklären. Von daher gehe ich nun StepbyStep den Code von Ihm selbst durch... Schließlich gibt es ja auch eine Previous Button :-)...
    Ich habe mich auch damit beschäftigt, aber ich stehe wahrscheinlich/nein ganz sicher nicht so tief in der Materie wie er und du. Ich habe mir schon viele Beiträge aus Interesse durchgelesen und sehr oft erhält der Fragende eine Antwort von Dir oder Ihm... Das ist so ähnlich wie eine völlig verschachtelte Excelformel, die von den Experten einfach so aus dem Arm geschüttelt werden, da sie jahrelange Erfahrung bzw. Wissen mit sich bringen und so ist das auch bei euch. Ich stapfe sozusagen in einer Unzahl an Befehlen die man verwenden kann und suche nach einer Lösung. Aber manchmal weiß ich gar nicht wonach ich suchen soll, da ich nicht weiß das dieser Befehl existiert. Das ist mein Problem. Ich bin gern bereit abstrakt zu denken. Wenn es auf diesem Wege nicht möglich gewesen wäre, hätte ich versucht zur Laufzeit die Mouseposition zu ändern udn ein Klickereignis ausgelöst...
    Ich versuche nun Zeile für Zeile zu verstehen - natürlich würde ich mich über eine Erläuterung sehr freuen.

    Ich wünsche euch beiden einen schönen Abend - ihr leistet immer großartige Hilfe.
    LG TOYY1
    @toyy1 @ErfinderDesRades
    Den Code hab ich an diesem Treeview gecodet:

    Zur Kennzeichnung hab ich dem selektierten Node einen roten Punkt verliehen, da sieht man, wo er ist und wo er hin soll.
    Ich denke mal, dass ich den Code für beide Richtungen in den Sourcecode-Austausch stelle, da wird er auch anständig kommentiert sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    toyy1 schrieb:

    Aber ich habe bereits in anderen Fragestellungen gelsen, dass dann ein anderer User geschrieben hat das es an Faulheit grenzt nun auch noch die einzelnen Zeilen zu erklären.
    Ja, vielen Usern fällt gutes Benehmen ausserordentlich schwer, und sie finden sich super-cool, wenn sie irgendeinen armen Wicht ein bischen bashen können. :thumbdown:

    Da hilft ühaupt nix, bzw. was hilft ist ein dickes Fell, und den Mut, dennoch zu fragen. Weisst ja - Sesamstrasse: "Wer nicht fragt bleibt dumm."

    Und man sagt auch: "Es gibt keine dummen Fragen, es gibt nur dumme Antworten."

    (Ganz so weit würde ich aber nicht gehen - es gibt durchaus auch dumme Fragen. Aber schon richtig, und richtig schmerzhaft, wie viele dumme Antworten es gibt, hier auf VBP)

    (Ich kann mich vom schlechten Benehmen auch nicht ganz ausnehmen, jetzt habich die Anfänger-Basher gebasht, und an Rods Code habich ja auch rumgekrittelt - also kann ich sagen "Ich gehör zu den Guten"?)

    Wie gesagt: Mit einem dicken Fell biste immer auf der sicheren Seite. ;)

    Und bei Fragen fragen.
    Ich freu mich immer über Nach-Fragen zu Codes von mir, weil dann weiß ich, dass sich jemand mit auseinandersetzt.
    Man muss auch die Fragen angucken - oft gibts Nachfragen, wo man sieht: der Kerl fragt dumm herum, hat sich aber nichtmal die Mühe gemacht, den Code überhaupt auszuprobieren.
    Da geht mir dann auch sofort jedes Benehmen flöten - und das ist ja auch ein gradezu konträrer Fall wie hier bei dir, wo du sagst "Jawoll - Code geht, aber wieso eiglich?"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()