'/树操作基本参数列表.
Type BaseParameter
Cnn As ADODB.Connection 'ADODB 连接
TrvName As Object '树名称.
TabName As String '树对应的数据表名
ParFld As String '数据表中父节点的字段名.
ChildFld As String '数据表中子节点的字段名.
TextFld As String '数据表中节点文本名称的字段名.
RootIco As String '树中根目录的图标号.
Parico As String '树中父节点的图标号.
ExpParIco As String '树中展表一个节点时的图标号.
ChildIco As String '树中子节点的图标号.
RootText As String '树中根节点的文件.
End Type
Public Function KillNodex(SelNode As Object)
If SelNode.Key <> SelNode.Root.Key Then
If SelNode.Parent.Children <= 1 And SelNode.Parent.Key <> SelNode.Root.Key Then
SelNode.Parent.Image = TrvBasePar.ChildIco
SelNode.Parent.ExpandedImage = TrvBasePar.ChildIco
End If
Call DelNode(SelNode)
TrvBasePar.TrvName.Nodes.Remove (SelNode.Key)
End If
End Function
Private Function DelNode(NodeX As Node)
Dim N As Long
Dim StrSql As String
Dim MoveNode() As Node
Dim AddId As Long
Dim TmpNode As Node
With TrvBasePar
If Not (TrvBasePar.Cnn Is Nothing) Then
StrSql = "DELETE FROM " & .TabName & " WHERE " & .ParFld & "='" & Right$(NodeX.Parent.Key, Len(NodeX.Parent.Key) - 1) & "' AND " & _
.ChildFld & "='" & Right$(NodeX.Key, Len(NodeX.Key) - 1) & "'"
TrvBasePar.Cnn.Execute StrSql
End If
If NodeX.Children > 0 Then
AddId = 0
N = NodeX.Child.Index
If .TrvName.Nodes(N).Children > 0 Then
AddId = AddId + 1
ReDim Preserve MoveNode(AddId)
Set MoveNode(AddId - 1) = .TrvName.Nodes(N)
Else
Set TmpNode = .TrvName.Nodes(N)
If Not (.Cnn Is Nothing) Then
StrSql = "DELETE FROM " & .TabName & " WHERE " & .ParFld & "='" & Right$(TmpNode.Parent.Key, Len(TmpNode.Parent.Key) - 1) & "' AND " & _
.ChildFld & "='" & Right$(TmpNode.Key, Len(TmpNode.Key) - 1) & "'"
.Cnn.Execute StrSql
End If
End If
While N <> NodeX.Child.LastSibling.Index
N = .TrvName.Nodes(N).Next.Index
If .TrvName.Nodes(N).Children > 0 Then
AddId = AddId + 1
ReDim Preserve MoveNode(AddId)
Set MoveNode(AddId - 1) = .TrvName.Nodes(N)
Else
Set TmpNode = .TrvName.Nodes(N)
If Not (.Cnn Is Nothing) Then
StrSql = "DELETE FROM " & .TabName & " WHERE " & .ParFld & "='" & Right$(TmpNode.Parent.Key, Len(TmpNode.Parent.Key) - 1) & "' AND " & _
.ChildFld & "='" & Right$(TmpNode.Key, Len(TmpNode.Key) - 1) & "'"
.Cnn.Execute StrSql
End If
End If
Wend
If AddId > 0 Then
For N = 0 To AddId - 1
Call DelNode(MoveNode(N))
Next
End If
End If
提供两个办法,比如要删除一个key为“k2”的node下的所有节点,但不删除k2这个node:
1,最简单的办法:先记录下k2这个node的信息,然后用nodes.remove "k2"删除调这个k2这个node,这样其子node也都没了,然后在add回原先的k2这个node;
2,枚举k2的所有的子节点,依次删除,程序如下:
Dim obj As Node
Dim k() As String
Dim iCount As Integer
For Each obj In tvw.Nodes
If Not (obj.Parent Is Nothing) Then
If obj.Parent.Key = "k2" Then
ReDim Preserve k(iCount)
k(iCount) = obj.Key
iCount = iCount + 1
End If
End If
Next obj
For i = 0 To iCount - 1
tvw.Nodes.Remove k(i)
Next