treeview node durch pfad-angabe löschen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von timmi31061.

    treeview node durch pfad-angabe löschen

    hallo zusammen

    nachdem die online-suche leider erfolglos war frage ich nun hier einmal:

    ich würde gerne in einem treeview einige nodes löschen indem ich den zugehörigen pfad übergebe und den node mit dem pfad lösche. leider hab ich keine lösungsansätze gefunden.

    vllt weiß einer von euch ja rat :)
    ne die nodes im treeview besitzen ja immer einen sog. fullpath, d.h der pfad zu dem knoten

    z.B:

    knoten1
    -unterknoten1.1
    -unterknoten1.2
    -unterunterknoten1.2.1
    knoten2
    ...

    von unterunterknoten1.2.1 ist der pfad (fullpath) knoten1\unterknoten1.2\unterunterknoten1.2.1

    wie kann ich das treeview ansprechen um einen knoten zu löschen in der weise:

    treeview1.nodes(pfad).Remove z.B. ??
    nein, er muß den Node herausfinden und löschen - nicht den Index.
    Und das ist nicht ganz trivial, ich such mal meinen Code dafür.

    Lösung mit Extension-Methods

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Imports System.Drawing
    3. Public Module TreeNodeX
    4. Public Structure ApproachResult
    5. Public ReadOnly Node As TreeNode
    6. Public ReadOnly StepsDone As Integer
    7. Public ReadOnly Segments As IList(Of String)
    8. Public Sub New( _
    9. ByVal Node As TreeNode, _
    10. ByVal Segments As IList(Of String), _
    11. ByVal StepsDone As Integer)
    12. Me.Node = Node
    13. Me.Segments = Segments
    14. Me.StepsDone = StepsDone
    15. End Sub
    16. Public ReadOnly Property IsFullMatch() As Boolean
    17. Get
    18. Return Segments.Count = StepsDone
    19. End Get
    20. End Property
    21. End Structure 'ApproachResult
    22. ''' <summary>
    23. ''' sucht in Nodes und SubNodes anhand eines Pfades nach dem bezeichneten Node.
    24. ''' Bei Nichtexistenz des ZielNode den übergeordneten, in den der ZielNode zu erstellen wäre
    25. ''' </summary>
    26. ''' <param name="PathSegments">Die Segmente des Pfades</param>
    27. ''' <returns>ein
    28. ''' <see cref="ApproachResult"> ApproachResult,
    29. ''' das den gefundenen Node enthält, und die Anzahl abgearbeiteter Segmente
    30. ''' </see>
    31. ''' </returns>
    32. <Extension()> _
    33. Public Function Approach(ByVal Nodes As TreeNodeCollection, _
    34. ByVal PathSegments As IList(Of String)) As ApproachResult
    35. Dim Nd As TreeNode = Nothing, I As Integer
    36. For I = 0 To PathSegments.Count - 1
    37. Dim tmp = Nodes.ByText(PathSegments(I))
    38. If tmp Is Nothing Then Exit For
    39. Nd = tmp
    40. Nodes = Nd.Nodes
    41. Next
    42. Return New ApproachResult(Nd, PathSegments, I)
    43. End Function
    44. <Extension()> _
    45. Public Function ByText(ByVal Nodes As TreeNodeCollection, ByVal text As String) As TreeNode
    46. For Each nd As TreeNode In Nodes
    47. If String.Compare(nd.Text, text, True) = 0 Then Return nd
    48. Next
    49. Return Nothing
    50. End Function
    51. <Extension()> _
    52. Public Function Approach(ByVal TV As TreeView, ByVal NodePath As String) As ApproachResult
    53. Return TV.Nodes.Approach(NodePath.Split(New String() {TV.PathSeparator}, StringSplitOptions.None))
    54. End Function
    55. <Extension()> _
    56. Public Function ParentNodes(ByVal Nd As TreeNode) As TreeNodeCollection
    57. Dim Parent = Nd.Parent
    58. Return If(Parent Is Nothing, Nd.TreeView.Nodes, Parent.Nodes)
    59. End Function
    60. <Extension()> _
    61. Public Sub Delete(ByVal Nd As TreeNode, Optional ByVal Recursive As Boolean = False)
    62. Dim ParentNodes = Nd.ParentNodes
    63. If Not Recursive Then
    64. 'nur diese Instanz ausschneiden, Children an meinen Parent hängen
    65. Dim Nodes = Nd.Nodes
    66. For I = Nodes.Count - 1 To 0 Step -1
    67. Dim Nd2 = Nodes(I)
    68. Nodes.RemoveAt(I)
    69. ParentNodes.Add(Nd2)
    70. Next
    71. End If
    72. Nd.Remove()
    73. End Sub
    74. <Extension()> _
    75. Public Sub EnsureVisibleX( _
    76. ByVal Nd As TreeNode, _
    77. ByVal Align As StringAlignment, Optional ByVal Forced As Boolean = False)
    78. If Nd.IsVisible AndAlso Not Forced Then Return
    79. 'Zeigt den sichtbar zu machenden Node Oben / Unten / Mitten im Treeview an.
    80. Dim TV = Nd.TreeView
    81. Select Case Align
    82. Case StringAlignment.Near
    83. TV.TopNode = Nd
    84. Case StringAlignment.Far
    85. TV.TopNode = TV.Nodes(0)
    86. Nd.EnsureVisible()
    87. Case StringAlignment.Center
    88. Nd.EnsureVisibleX(StringAlignment.Far)
    89. With Nd.Bounds
    90. Dim Nd2 As TreeNode = TV.GetNodeAt(1, .Bottom + .Height - TV.Height \ 2)
    91. If Nd2 IsNot Nothing Then TV.TopNode = Nd2
    92. End With
    93. End Select
    94. End Sub
    95. End Module
    Aufrufbeispiel:

    VB.NET-Quellcode

    1. With TreeView1.Approach("Knoten1\Knoten3")
    2. If .IsFullMatch Then
    3. .Node.Remove()
    4. Else : MessageBox.Show("Knoten nicht gefunden")
    5. End If
    6. End With

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

    @ErfinderDesRades

    DANKE vorerst einmal für eure Mühe :D

    hab jetzt die methode:

    VB.NET-Quellcode

    1. Module Approach
    2. <Extension()>
    3. Public Function Approach(ByVal Nodes As TreeNodeCollection, ByVal PathSegments As IList(Of String)) As ApproachResult
    4. Dim Nd As TreeNode = Nothing, I As Integer
    5. For I = 0 To PathSegments.Count - 1
    6. If Not Nodes.ContainsKey(PathSegments(I)) Then Exit For
    7. Nd = Nodes(PathSegments(I)) ' Node per String-Key referenzieren.
    8. Nodes = Nd.Nodes
    9. Next
    10. Return New ApproachResult(Nd, PathSegments, I)
    11. End Function
    12. <Extension()>
    13. Public Function Approach(ByVal TV As TreeView, ByVal NodePath As String) As ApproachResult
    14. Return TV.Nodes.Approach(Microsoft.VisualBasic.Strings.Split(NodePath, TV.PathSeparator))
    15. End Function
    16. Public Structure ApproachResult
    17. Public ReadOnly Node As TreeNode
    18. Public ReadOnly StepsDone As Integer
    19. Public ReadOnly Segments As IList(Of String)
    20. Public Sub New(ByVal Node As TreeNode, ByVal Segments As IList(Of String), ByVal StepsDone As Integer)
    21. Me.Node = Node
    22. Me.Segments = Segments
    23. Me.StepsDone = StepsDone
    24. End Sub
    25. Public ReadOnly Property IsFullMatch() As Boolean
    26. Get
    27. Return Segments.Count = StepsDone
    28. End Get
    29. End Property
    30. End Structure 'ApproachResult
    31. End Module




    aber es kommt mit der dem beispiel von ErfinderDesRades immer nur "Knoten nicht gefunden" sobald ich im Pfad habe Subnodes

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

    okay tut mir leid :p

    ich hab z.B. den ordner:

    Neuer_Ordner
    |_Musik.mp3
    |_Document.doc
    |_Text.txt

    und wenn ich dann

    VB.NET-Quellcode

    1. With TreeView2.Approach("Neuer_Ordner/Text.txt")
    2. If .IsFullMatch Then
    3. MessageBox.Show("Knoten gefunden")
    4. Else : MessageBox.Show("Knoten nicht gefunden")
    5. End If
    6. End With


    mache kommt "Knoten nicht gefunden"