如题,在线等

解决方案 »

  1.   

    提供两个办法,比如要删除一个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 IntegerFor 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 objFor i = 0 To iCount - 1
        tvw.Nodes.Remove k(i)
    Next
      

  2.   

    删除某节点下的所有子节点,本人用递归的方法(因为也删除数库的数据,必须要完全检索完该节点下的所有节点),如果你的意思与我的类同,则下面代码可作参考.'/树操作基本参数列表.
    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 TypeDim TrvBasePar As BaseParameter'
    '删除某节点下的所有子节点(递归)
    '函数:KillNodex
    '参数:SelNode 被删除的节点.
    '返回值:
    '说明:该函数既删除树中的节点,亦删除数据库中的节点及其子节点.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 FunctionPrivate 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
            
            End With
    End Function