另外还有一个小问题捎带着问了吧,就是treeview中的节点的index值是怎么排的啊,是从上到下的这么排,还是父节点单独排,然后再排子节点啊?
----那个先加入那个先排没有规律

解决方案 »

  1.   

    你这段代码是通过treeview来删除数据库中的内容吧,你到底想实现什么?
    连子结点一块儿删?
      

  2.   

    刷新数据啊
    先Clear
    再读取一篇
      

  3.   

    同意楼上的。
    把treeview Clear,再.....
      

  4.   

    删除子节点,需要递规。如下入口参数是选中的要删除的那个节点的Key,注意,添加的时候,每个节点都设置一个Key,对你的程序将有很大的好处。可以给你带来无法想象的方便Private Sub DelNot(sKey as String)
    Dim Nod as Node
        set nod=treeview1.selectitem
        while nod.children>0 
           delnod nod.child.key
        wend
        treeview1.nodes.remove skey
        '//在这里加入删除数据库中记录的语句,即可实现数据库和Treeview同步删除,而不用Clear然后在读取一遍。
    end sub
      

  5.   

    Private Sub delete_Click()
    Dim reply1  As Integer
    Dim i As Integer
        With TreeView1
             For i = 1 To .Nodes.Count - 1
                    If .Nodes(i).Selected Then
                       If .Nodes(i).Parent Is Nothing Then
                          MsgBox "无法删除根节点", vbCritical, "提示"
                          Exit For
                       End If
                       If .Nodes(i).Children > 0 Then
                       reply1 = MsgBox"确认删除吗", vbCritical + vbOKCancel, "提示")
                          If reply1 = vbOK Then
                            TreeView1.Nodes.Remove (i)
                            TreeView1.Nodes.Remove TreeView1.Nodes(i).Children
                            Dim con As New ADODB.Connection
                            Dim Rs As New ADODB.Recordset
                            Dim mysql As String
                            con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\db1.mdb;Persist Security Info=False"
                            con.Open
                            mysql = "delete  from  group1   where zu = '" & TreeView1.Nodes(i).Text & "'"
                            Rs.Open mysql, con,adOpenStatic,adLockOptimistic
                            Rs.Update
                            Exit For
                        End If
                        End If
                    End If
            Next i
        End With
    End Sub
    可为什么我一删除,总提示说“索引超出边界”,请问这是怎么会事儿啊
    问题解决了,要多少分您说话!
      

  6.   

    索引超出边界,就是说你根本就没有那么多节点,可是你又在删除那些节点了。
    其实非常简单,在删除动作之前,Index和删除一个之后的Index是不同的。Node的内部其实和Collection一样。它能自动伸缩,例如你有10个node,你删除了第五个node,那么后面的Index就自动的往前减去一个1。所以才出现你所说的超出索引边界的问题。但是如我在前面所说的那样,都使用Key,就删除时,以Key为关键字,就不会出现你所说的问题了。在一个Treeview里,Key是唯一的。所以无论你有多少node,都不能出现相同的key。要得到这种key,有很多方法。例如Timer函数得到的就是一个以1/1000精度的从计算机启动到当前时间的长度的值,如果用这个来作为key,就很难得到相同的key了。不过也用另一种更好的方法。定义一个长整型变量。每次增加一个node就加一,而删除的时候,并不将这个数减一。这样得到的key也是唯一的。总之有许多方法去实现,你自己权衡一下即可。
    得到了这个key之后,再按照我上面的方法处理删除node的动作。
    在添加node的时候,如下
    dim nod as node
    set nod=treeview.nodes.add(.......key)
    就是将得到的唯一的key随node添加的时候设置进去。另外,应该将key保存在数据库里。
    例如下面结构的数据库表就是一个非常不错的节点数据保存器id     name     key         parent_key
    0      node1    node12334   
    1      node2    node12335   node12334
    2      node3    node12336   node12334现在你该明白了吧再次从数据库中取出记录时,顺便取得了parent_key,这样就是一个单向链表了。将链表数据加入TreeView中,该不用我说了吧
      

  7.   

    我现在已经给各节点添加了key值,但是我在采用上面的删除节点的key值的时候却出现了错误,我是这么想的,在一个按纽的点击事件中调用这一过程
    Private Sub DelNot(sKey as String)
    Dim Nod as Node
        set nod=treeview1.selectitem
        while nod.children>0 
           delnod nod.child.key
        wend
        treeview1.nodes.remove skey
    end sub
    结果却出现了这种错误:out of stack space
    请问我这么做对吗?
    如果不对,应该怎么弄啊?
      

  8.   

    我对你的程序坚信不移,我就是要问一个弱智问题,这个过程我要在哪里调用,我必须把它放到一个事件触发里面吧,比如说我点击一个按纽进行删除,怎么做,怎么用这个过程delnod?
      

  9.   

    在删除某个节点的时候,就可以调用它。无论这个节点有没有子节点,都可以调用。也就是说,无论你什么时候想删除任何节点,都可以使用这个函数。唯一的前提是,你的每个节点都必须有唯一的Key。例如你在某个节点上单击右键,在你定义的弹出菜单上选择了你定义的“删除”的菜单选项。或者你选取了某个节点,然后又点击某个按钮进行删除。总之只要你愿意在任何事件里都可以调用这个函数。只要入口参数正确即可。不过我得警告你,由于我在这段程序中没有写错误处理代码,因此,如果传入了错误的节点Key,将可能导致错误产生,你可以放置一段代码,以便对所有可能产生的错误进行处理,以保证程序的正常运行。
      

  10.   

    补充:
      关于我的那段程序,只要你的每个节点都有Key,而且在删除的时候,首次传入的Key是绝对正确的。一般是不会出现任何问题的。
      不过据说在VB中,递归函数最多能递归296层,超过这个数,将产生错误。这个我没有试验过。小心一点
      

  11.   

    我没细看代码,不过听你说删除时老是“索引超出边界”,我想你可以这样:
    For i = .Nodes.Count - 1 To 1  Step -1
    ......
    ....
    Next
    一般从列表类控件中删除项目都是这样倒过来循环的, 可以避免很多麻烦。  :)