Treeview zu einem Hauptknoten einen untergeordneten Knoten hinzufügen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von vierkant.

    Treeview zu einem Hauptknoten einen untergeordneten Knoten hinzufügen

    Hallo!
    Treeview

    Also in meiner Treeview befinden sich Beispielsweise 2 Hauptknoten:
    2012
    2013

    per code will ich jetzt 2012 einen untergeordneten Knoten hinzufügen, das sollte dann so ausschauen:

    2012
    - Dezember
    2013

    Jetzt hätte ich mir das ganze so gedacht:

    VB.NET-Quellcode

    1. Explorer1.TreeView1.Nodes(txtjahr.Text).Nodes.Add(txtmonat.Text)



    in meinen Textboxen steht natürlich folgende Werte:
    txtjahr = 2012
    txtmonat = Dezember


    leider funktioniert das nicht so, jemand eine Idee?
    THX
    @iEi
    Wieso kommst du jetzt mit diesem Link? Das hat er doch auch genau so gemacht, wie in dem Thread beschrieben :D Das es nicht funktioniert liegt an einem anderen Problem.

    @vierkant
    Das Problem ist folgendes: bei TreeView.Nodes gibt man in die Klammer den NAMEN eines Knotens ein. Du willst ja eigentlich nach dem TEXT die SubNodes hinzufügen. Ich hab dir wieder einen Codeabschnitt geschrieben. Hier das Ergebnis:

    VB.NET-Quellcode

    1. Private Sub AddNode(ByVal NodeText As String, ByVal SubNodeText As String, ByVal Nodes As TreeNodeCollection)
    2. For Each lNode As TreeNode In Nodes
    3. If lNode.Text = NodeText Then
    4. lNode.Nodes.Add(SubNodeText)
    5. Else
    6. AddNode(NodeText, SubNodeText, lNode.Nodes)
    7. End If
    8. Next
    9. End Sub

    Das Aufrufen funktioniert dann so:

    VB.NET-Quellcode

    1. AddNode("2013", "Dezember", TreeView1.Nodes)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Danke schön! Funktioniert!!

    So bevor die Knoten erstellt werden prüfe ich ob sie schon vorhanden sind:

    VB.NET-Quellcode

    1. Private Function FindNode(ByVal Text As String, ByVal Nodes As TreeNodeCollection) As Boolean
    2. For Each lNode As TreeNode In Nodes
    3. If lNode.Text = Text Then
    4. Return True
    5. Else
    6. If FindNode(Text, lNode.Nodes) Then
    7. Return True
    8. End If
    9. End If
    10. Next
    11. Return False
    12. End Function


    und

    VB.NET-Quellcode

    1. If FindNode("Dezember", Explorer1.TreeView1.Nodes).ToString = False Then



    Funktioniert ganz gut aber mein kleiner Fehler besteht noch:

    Wenn mein Treeview angenommen so ausschaut:
    2013
    - Dezember

    und ich will für das Jahr 2012 auch den Monat Dezember erstellen geht das nicht weil ja schon 1 mal ein Dezember in meiner Liste ist. Also dachte ich mir ich mach das so:

    VB.NET-Quellcode

    1. If FindNode("2013", "Dezember", Explorer1.TreeView1.Nodes).ToString = False Then


    leider pustekuchen
    Wieso hier:

    VB.NET-Quellcode

    1. If FindNode("2013", "Dezember", Explorer1.TreeView1.Nodes).ToString = False Then

    ToString()?
    Zur Lösung:
    1. In Projekteigenschaften gehen(Rechtsklick auf Projekt in Projektmappenexplorer > Eigenschaft) und dort Option Strict auf ON stellen.
    2. Das ToString aus der Zeile nehmen, denn ToString gibt wie bereits schon gesagt einen Wert vom Typ String zurück. False ist jedoch vom Typ Boolean > Text und Boolean passen nur schlecht zusammen. Die FindNode-Funktion gibt schon einen Boolean zurück und somit kannst du das direkt mit verwenden. Immer zuerst überlegen ob du Strings brauchst.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @vierkant

    vierkant schrieb:

    VB.NET-Quellcode

    1. If FindNode("2013", "Dezember", Explorer1.TreeView1.Nodes).ToString = False Then

    FindNode gibt bereits einen Boolean zurück, den natürlich nicht mehr umwandeln musst, wenn du in mit einem Wahrheitswert vergleichen willst. Mach unbedingt Option Strict auf ON, damit du keinen Datentypen-Obstsalat bekommst. Ich habe jetzt meine schon oben gepostete FindNode-Funktion ein wenig erweitert. Hier das Ergebnis:

    VB.NET-Quellcode

    1. Private Function FindNode(ByVal NodeText As String, ByVal ParentNodeText As String, ByVal nodes As TreeNodeCollection) As Boolean
    2. For Each lNode As TreeNode In nodes
    3. If lNode.Text = NodeText AndAlso lNode.Parent.Text = ParentNodeText Then
    4. Return True
    5. Else
    6. If FindNode(NodeText, ParentNodeText, lNode.Nodes) Then
    7. Return True
    8. End If
    9. End If
    10. Next
    11. Return False
    12. End Function

    So machst du dann das, was du im vorherigen Post probiert hast:

    VB.NET-Quellcode

    1. If Not FindNode("Dezember", "2012", TreeView1.Nodes) Then
    2. AddNode("2012", "Dezember", TreeView1.Nodes)
    3. End If

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Hallo! Und wieder ich!!

    Wenn ich jetzt einen bestimmten Knoten löschen möchte, z.B.:

    2013
    - November
    2014
    - November

    es soll nun der Knoten "November" aus dem Jahr 2013 gelöscht werden!

    Irgendwie verstehe ich noch nicht ganz das Prinzip wie ich den Knotentext (und nicht Knotennamen) ansprechen kann
    Und ich antworte auch wieder und habe wieder was kleines gebastelt :D. Ich schreibe ein paar Kommentare dazu, damit du auch das Prinzip verstanden hast und auch selber mal sowas entwickeln kannst :). Nun mein Code:

    VB.NET-Quellcode

    1. Private Sub DeleteNode(ByVal NodeText As String, ByVal ParentNodeText As String, ByVal Nodes As TreeNodeCollection)
    2. 'Jeder Knoten im in der TreeNodeCollection wird durchgearbeitet (zu Beginn die Hauptknoten des TreeViews und später die Knoten der Unterknoten, usw.)
    3. For Each lNode As TreeNode In Nodes
    4. 'Wenn der Text des Knoten dem angebenen Text entspricht (dem NodeText) und der Text des übergeordneten Knotens dem ParentNodeText entspricht wird der Knoten gelöscht
    5. If lNode.Text = NodeText AndAlso lNode.Parent.Text = ParentNodeText Then
    6. lNode.Remove()
    7. Else
    8. 'Falls nicht werden von dem Knoten die Unterknoten als TreeNodeCollection angegeben und DeleteNode geht wieder von vorne los
    9. DeleteNode(NodeText, ParentNodeText, lNode.Nodes)
    10. End If
    11. Next
    12. End Sub

    Ich hoffe du hast jetzt das Prinzip dahinter verstanden und kannst auch selbstständig sowas in der Art machen ;) Das mit dem Aufrufen schafftst du denke und hoffe ich allein :D

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom