【问题标题】:Loop through treeview nodes to delete certain nodes循环遍历树视图节点以删除某些节点
【发布时间】:2010-12-16 12:16:46
【问题描述】:

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

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

My Disk:
|
|--folder1(tag:folder)
|  |--subfolder1(tag:folder)
|--folder2(tag:folder)
|--folder3(tag:folder)
|--folder4(tag:folder)
   |file1(tag: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)

但是,上述操作无法正常工作。它只删除一些节点,而不是所有目标节点。你能帮我修好我的潜艇吗?

非常感谢

【问题讨论】:

  • 作为旁注(我的意见):打开 Option Strict On,它可以为您省去很多麻烦。

标签: vb.net treeview


【解决方案1】:

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

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

这是未经测试的。

【讨论】:

  • 或者更好的“For i As Integer = nc.Count - 1 to 0 Step -1”。那么 elseIf 部分就不再需要“i -= 1”了
  • 您好,感谢您的回复。我已经尝试了代码,但它并没有完全工作。它删除了除 node(0) 之外的大多数目标节点。要么是因为它只处理顶级节点,要么是因为“for”循环不是 100% 正确的。我还在想办法。
  • @mazrabul: nc(0) 真的符合标准吗,因为它肯定是经过检查的。
  • @Bobby:我已经编辑了原始问题以准确反映我测试的树视图结构。 'folder1' 没有被删除,但是里面的子文件夹被删除了。
  • @mazrabul:哦……现在我明白了……我已经编辑了我的答案。
【解决方案2】:

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

如果是这样,请不要添加带有该标签的节点。

如果不是,for each 循环是个问题,因为每次调用删除节点函数时都会更改树节点集合。

我已经通过创建一个集合来存储要删除的密钥来解决这个问题,并且在每个循环之后,您可以安全地删除您想要的节点。 GL.

例如:

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

【讨论】:

  • 感谢您的代码。但我的主要问题是“for”循环。我怎样才能使它以递归方式定位我想要的节点,而不仅仅是顶层......
  • 第一个循环与 tvSS 中的所有节点交互。所以要快乐... ;)
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2011-01-16
  • 2012-12-12
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多