我有一个预构建的TreeView
控件。我想根据保存在数据库中的值删除作为权限集的节点。我使用了一种递归方法来删除节点,但有些节点仍然存在,不会被删除。这是我的代码:
Private Sub setNodes()
For Each nd As TreeNode In TreeView1.Nodes
If nd.Name = "Students" AndAlso row.Item("CanAddStudents") = False AndAlso row.Item("CanViewStudents") = False AndAlso row.Item("CanImportStudents") = False Then
nd.Remove()
nd.Tag = False
End If
If Not nd.Tag = False Then
setNodes(nd)
End If
nd.Tag = True
Next
End Sub
Private Sub setNodes(ByVal nd As TreeNode)
For Each childNd As TreeNode In nd.Nodes
If childNd.Name = "Registration" AndAlso row.Item("CanAddStudents") = False Then
childNd.Remove()
childNd.Tag = False
ElseIf childNd.Name = "View_Registration" AndAlso row.Item("CanViewStudents") = False Then
childNd.Remove()
childNd.Tag = False
ElseIf childNd.Name = "Import_Student" AndAlso row.Item("CanImportStudents") = False Then
childNd.Remove()
childNd.Tag = False
End if
Next
If Not childNd.Tag = False Then
setNodes(childNd)
End If
childNd.Tag = True
End Sub
此代码适用于单个父节点及其子节点,但当父节点超过1个时则不起作用。如果有3个父节点,则其中一个父节点不会删除。
我更改了代码如下。
Private Sub RemoveNodes(ByVal nc As TreeNodeCollection)
For i As Integer = nc.Count - 1 To 0 Step -1
If nc(i).Nodes.Count > 0 Then
RemoveNodes(nc(i).Nodes)
End If
If nc(i).Name = "Registration" AndAlso row.Item("CanAddStudents") = False Then
nc.RemoveAt(i)
ElseIf nc(i).Name = "View_Registration" AndAlso row.Item("CanViewStudents") = False Then
nc(i).Remove()
ElseIf nc(i).Name = "Import_Student" AndAlso row.Item("CanImportStudents") = False Then
nc(i).Remove()
ElseIf nc(i).Name = "Students" AndAlso row.Item("CanAddStudents") = False AndAlso row.Item("CanViewStudents") = False AndAlso row.Item("CanImportStudents") = False Then
nc(i).Remove()
End If
Next
End Sub
光看这段代码很难说,但有一件事对我来说确实很奇怪,那就是在setNodes(TreeNode)
方法中,它只在最后一个子节点上递归地调用自己。如果要为每个节点执行此操作,则需要将底部的If
语句上移到For
循环中。例如:
For Each childNd As TreeNode In nd.Nodes
If childNd.Name = "Registration" AndAlso row.Item("CanAddStudents") = False Then
childNd.Remove()
childNd.Tag = False
ElseIf childNd.Name = "View_Registration" AndAlso row.Item("CanViewStudents") = False Then
childNd.Remove()
childNd.Tag = False
ElseIf childNd.Name = "Import_Student" AndAlso row.Item("CanImportStudents") = False Then
childNd.Remove()
childNd.Tag = False
End if
'Put recursive call inside loop
If Not childNd.Tag = False Then
setNodes(childNd)
End If
childNd.Tag = True
Next