开发者

Loop through treeview nodes to delete certain nodes

开发者 https://www.devze.com 2023-01-30 17:23 出处:网络
Hello and thanks in advance for your help. I have a treeview that is populated from a HDD folder collection. Its structure is similar to the following (however the structure is dynamic):

Hello and thanks in advance for your help.

I have a treeview that is populated from a HDD folder collection. Its structure is similar to the following (however the structure is dynamic):

My Disk:
|
|--folder1(tag:folder)
|  |--subfolder1(tag:folder)
|--folder2(tag:folder)
|--folder3(tag:folder)
|--folder4(tag:folder)
   |file1(tag:file)

I would like to delete all nodes from the tree that do not contain nodes with the tag "file" (basically empty folders). I would like the resulting tree structure to look like this:

My Disk:
|--folder4(tag:folder)
   |file1(tag:file)

The best that I have come up with is the following:

Private Sub deleteNode(byval nc as TreeNodeCollection)
 For Each tn As TreeNode In nc
  'delete node if it applies
        If tn.Tag = "folder" Then
            If tn.Nodes.Count = 0 Then
                 nc.Remove(tn)
            End If
        End If

        If tn.Nodes.Count > 0 Then
             deleteNode(tn.Nodes)
        End If
    Next
开发者_开发技巧End Sub

I call the sub as follows:

deleteNode(treeview1.Nodes(0).Nodes)

However, the above is not working properly. It deletes only some nodes and not all the targeted nodes. Could you please help me out by fixing my sub?

Many thanks


As far as I know, you can't edit the collection you're enumerating, so that it removes some nodes is also impressive.

You might wanna try another approach:

Private Sub RemoveEmptyFolderNodes(ByVal nc as TreeNodeCollection)
    For i As Integer = nc.Count - 1 To 0 Step -1
        If nc(i).Nodes.Count > 0 Then
            RemoveEmptyFolderNodes(nc(i).Nodes)
        End If
        If nc(i).Nodes.Count = 0 AndAlso nc(i).Tag.ToString() = "folder" Then
            nc.RemoveAt(i)
        End If                
    Next
End Sub

This is untested.


The treeview is initially populated by our program?

If so simply don't add the nodes with that tag.

If not, the for each loop is a problem since the treenode collection is been changed every time you call the remove node function.

I've solved this by creating a collection to store the keys to be removed and AFTER the for each loop you may safely remove the nodes you want. gl.

For example:

Dim nNd As Node
Dim toDel As New Collection

For Each nNd In tvSS.Nodes
    If nNd.tag="whatuwant" Then toDel.Add (nNd.Key)
Next
Do While toDel.Count > 0
    tvSS.Nodes.Remove (toDel.Item(1))
    toDel.Remove (1)
Loop
Set toDel = Nothing
0

精彩评论

暂无评论...
验证码 换一张
取 消