Knoten übernehmen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Selter98 schrieb:

    scheint nicht zu funktionieren
    Welchen Datentyp baben die TreeView1.SelectedNode.Nodes?
    Wie also musst Du Knoten deklarieren?
    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!
    OK, aus

    VB.NET-Quellcode

    1. ​Dim Knoten As TreeNodeCollection


    Habe ich leider aus Zeitgründen nicht gesehen.

    Was ich jedoch nicht verstehe, ist, dass "Knoten" Knotendaten übernimmt, obwohl diese nicht übernommen werden sollen:

    VB.NET-Quellcode

    1. 'Knotentausch vorbereiten
    2. TauschText = TreeView1.SelectedNode.Text
    3. TauschTag = TreeView1.SelectedNode.Tag
    4. Knoten = TreeView1.SelectedNode.Nodes
    5. 'Knotendaten aus vorherigen Index übernehmen
    6. TreeView1.SelectedNode.Text = TreeView1.Nodes(Index - 1).Text
    7. TreeView1.SelectedNode.Tag = TreeView1.Nodes(Index - 1).Tag
    8. TreeView1.SelectedNode.Nodes.Clear()
    9. For i = 1 To TreeView1.Nodes(Index - 1).Nodes.Count
    10. TreeView1.Nodes(Index).Nodes.Add(TreeView1.Nodes(Index - 1).Nodes(i - 1).Text)
    11. TreeView1.Nodes(Index).Nodes(i - 1).Tag = TreeView1.Nodes(Index - 1).Nodes(i - 1).Tag
    12. Next
    13. 'Knotendaten des vorherigen Index übernehem die Tauschdaten
    14. TreeView1.Nodes(Index - 1).Text = TauschText
    15. TreeView1.Nodes(Index - 1).Tag = TauschTag
    16. TreeView1.Nodes(Index - 1).Nodes.Clear()
    17. For i = 1 To Knoten.Count
    18. TreeView1.Nodes(Index - 1).Nodes.Add(Knoten(i - 1).Text)
    19. TreeView1.Nodes(Index - 1).Nodes(i - 1).Tag = Knoten(i - 1).Tag
    20. Next


    Hier sollen Knoten getauscht werden. Doch während des Tausches übernimmt "Knoten" im mittleren Abschnitt weiterhin Knotendaten, obwohl das in diesem Fall nicht erwünscht ist.

    So hat Nodes(Index) beispielsweise 2 untergeordnete Knoten und Nodes(Index-1) 8 untergeordnete Knoten. "Knoten" übernimmt zunächst die 2 untergeordnete Knoten. Nach dem Tauschen hat es unerwartet die 8 untergeordnete Knoten aus Nodes(Index-1).

    Gibt es eine Möglichkeit, dass "Knoten" nach der Ermittlung der Knotendaten diese behält?
    @Selter98 OK.
    Das überblicke ich hier jetzt nicht.
    Du hast es hier mit Instanzen von Klassen zu tun. Wenn Du Tag und Text übergibst, ist die Instanz noch dieselbe wie vorher, nur dass zwei Properties geändert werden.
    Ggf. musst Du die Nodes beim Swappen clonen.
    Steppe mal das ganze zeilenweise durch: Debuggen, Fehler finden und beseitigen
    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!
    Und ich kann es schon wieder nicht nachvollziehen:
    habe zu dem Tauschcode nur eine Erstellungs- und "Prüf"-Code hinzugefügt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub BtnFlipNodes_Click(sender As Object, e As EventArgs) Handles BtnFlipNodes.Click
    3. FlipSelectedNodeAndNodeWithIndex(1)
    4. End Sub
    5. Private Sub FlipSelectedNodeAndNodeWithIndex(Index As Integer)
    6. 'Knotentausch vorbereiten
    7. Dim TauschText = TvTest.SelectedNode.Text
    8. Dim TauschTag = TvTest.SelectedNode.Tag
    9. Dim Knoten = TvTest.SelectedNode.Nodes
    10. 'Knotendaten aus vorherigen Index übernehmen
    11. TvTest.SelectedNode.Text = TvTest.Nodes(Index - 1).Text
    12. TvTest.SelectedNode.Tag = TvTest.Nodes(Index - 1).Tag
    13. TvTest.SelectedNode.Nodes.Clear()
    14. For i = 1 To TvTest.Nodes(Index - 1).Nodes.Count
    15. TvTest.Nodes(Index).Nodes.Add(TvTest.Nodes(Index - 1).Nodes(i - 1).Text)
    16. TvTest.Nodes(Index).Nodes(i - 1).Tag = TvTest.Nodes(Index - 1).Nodes(i - 1).Tag
    17. Next
    18. 'Knotendaten des vorherigen Index übernehem die Tauschdaten
    19. TvTest.Nodes(Index - 1).Text = TauschText
    20. TvTest.Nodes(Index - 1).Tag = TauschTag
    21. TvTest.Nodes(Index - 1).Nodes.Clear()
    22. For i = 1 To Knoten.Count
    23. TvTest.Nodes(Index - 1).Nodes.Add(Knoten(i - 1).Text)
    24. TvTest.Nodes(Index - 1).Nodes(i - 1).Tag = Knoten(i - 1).Tag
    25. Next
    26. End Sub
    27. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    28. TvTest.Nodes.Add("1. Knoten")
    29. TvTest.Nodes.Cast(Of TreeNode).Last.Tag = "1. Tag"
    30. TvTest.Nodes.Add("2. Knoten")
    31. TvTest.Nodes.Cast(Of TreeNode).Last.Tag = "2. Tag"
    32. TvTest.Nodes.Add("3. Knoten")
    33. TvTest.Nodes.Cast(Of TreeNode).Last.Tag = "3. Tag"
    34. End Sub
    35. Private Sub TvTest_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TvTest.AfterSelect
    36. LblChecker.Text = e.Node.Tag.ToString
    37. End Sub
    38. End Class


    Ergebnis im Anhang. Alles wie gewünscht. Oben vor dem Tausch von 1 und 3, unten danach.

    ##########

    Ah, Unterknoten vergessen. Das Problem ist aber anders als gedacht. Ich habe dem 1. Knoten einen Unterknoten hinzugefügt. Wenn ich 1 und 3 tausche, landet der Unterknoten aber bei Knoten 2!

    ##########

    Klar, es geht ja auch gar nicht klar hervor, was Du tauschen willst. Du hast 3 Nodes im Code. SelectedNode (Zeile#3-#8), Node mit Index X (Z#10-#11) und Node mit Index X - 1 (so zeimlich überall sonst).
    Wenn man also den 5. Knoten anwählt und der Sub (die nicht vollständig von Dir gepostet wurde und daher viel Spekulatius über den korrekten Aufruf ermöglicht) als Parameter Index 1 übergibt, werden 3 verschiedene Knoten miteinander verdrillt. Die Subknoten werden von Knoten 1 auf 2 übertragen, Text und Tag aber von Knoten 5 auf Knoten 1.
    Bilder
    • FlipNodes.png

      8,37 kB, 765×375, 69 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Selter98 schrieb:

    vertauscht werden.
    Daas ist die falsche Herangehensweise.
    Der Knoten "Bearbeiten" soll nach dem Knoten "Extras" eingefügt werden.
    Probier mal so was:

    VB.NET-Quellcode

    1. Dim node = Me.TreeView1.SelectedNode
    2. Me.TreeView1.Nodes.Remove(node)
    3. Me.TreeView1.Nodes.Insert(newIndex, node)
    4. Me.TreeView1.SelectedNode = node
    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!