删除子节点,需要递规。如下入口参数是选中的要删除的那个节点的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
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 可为什么我一删除,总提示说“索引超出边界”,请问这是怎么会事儿啊 问题解决了,要多少分您说话!
索引超出边界,就是说你根本就没有那么多节点,可是你又在删除那些节点了。 其实非常简单,在删除动作之前,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中,该不用我说了吧
我现在已经给各节点添加了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 请问我这么做对吗? 如果不对,应该怎么弄啊?
连子结点一块儿删?
先Clear
再读取一篇
把treeview Clear,再.....
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
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
可为什么我一删除,总提示说“索引超出边界”,请问这是怎么会事儿啊
问题解决了,要多少分您说话!
其实非常简单,在删除动作之前,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中,该不用我说了吧
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
请问我这么做对吗?
如果不对,应该怎么弄啊?
关于我的那段程序,只要你的每个节点都有Key,而且在删除的时候,首次传入的Key是绝对正确的。一般是不会出现任何问题的。
不过据说在VB中,递归函数最多能递归296层,超过这个数,将产生错误。这个我没有试验过。小心一点
For i = .Nodes.Count - 1 To 1 Step -1
......
....
Next
一般从列表类控件中删除项目都是这样倒过来循环的, 可以避免很多麻烦。 :)