2010-12-16 7 views
2

Здравствуйте и спасибо за вашу помощь.Пройти через узлы дерева, чтобы удалить определенные узлы

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

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) 

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

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

+0

Как заметка на полях (мое мнение): Turn Option Strict On, это экономит много головной боли. – Bobby 2010-12-16 12:25:49

ответ

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

Или даже лучше «Для i As Integer = nc.Count - от 1 до 0 Шаг -1». Тогда больше нет необходимости в «i - = 1» в elseIf part – k3b 2010-12-16 12:37:18

+0

@ k3b: True, я отредактирую его. – Bobby 2010-12-16 12:40:13

0

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

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

Если нет, то для каждого цикла возникает проблема, так как коллекция treenode была изменена каждый раз, когда вы вызываете функцию remove node.

Я решил это, создав коллекцию для хранения ключей, которые нужно удалить, и ПОСЛЕ каждого цикла вы можете безопасно удалить нужные узлы. глобигерина

Например:

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