Цикл по узлам дерева, чтобы удалить определенные узлы - PullRequest
2 голосов
/ 16 декабря 2010

Привет и заранее спасибо за помощь.

У меня есть древовидная структура, которая заполняется из коллекции папок на жестком диске. Его структура похожа на следующую (однако структура является динамической):

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

Я вызываю субмарину следующим образом:

deleteNode(treeview1.Nodes(0).Nodes)

Однако вышеописанное не работает должным образом. Он удаляет только некоторые узлы, а не все целевые узлы. Не могли бы вы помочь мне исправить мой саб?

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 16 декабря 2010

Насколько я знаю, вы не можете редактировать перечисляемую коллекцию, так что она удаляет некоторые узлы, также впечатляет.

Вы можете хотите попробоватьдругой подход :

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

Это не проверено.

0 голосов
/ 16 декабря 2010

Древовидная структура изначально заполняется нашей программой?

Если это так, просто не добавляйте узлы с этим тегом.

Если нет, то проблема для каждого цикла является проблемой, так как коллекция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...