循环遍历树视图节点以删除某些节点

时间:2010-12-16 12:16:47

标签: vb.net treeview

您好,并提前感谢您的帮助。

我有一个从HDD文件夹集合中填充的树视图。它的结构类似于以下(但结构是动态的):

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

我想删除树中不包含标记为“file”的节点的所有节点(基本上是空文件夹)。我希望生成的树结构如下所示:

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

我想出的最好成绩如下:

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

我按如下方式调用sub:

deleteNode(treeview1.Nodes(0).Nodes)

但是,上述方法无法正常工作。它只删除一些节点而不是所有目标节点。你可以通过修理我的子来帮助我吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

据我所知,您无法编辑您要枚举的集合,因此删除某些节点也令人印象深刻。

您可以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

这是未经测试的。

答案 1 :(得分:0)

树视图最初是由我们的程序填充的?

如果是这样,只需添加带有该标记的节点。

如果没有,则每次循环都是一个问题,因为每次调用删除节点函数时都会更改treenode集合。

我已经通过创建一个集合来存储要删除的键来解决这个问题。在每个循环之后,您可以安全地删除所需的节点。冰川

例如:

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