以下是引用yuk_yu在2012-4-11 08:20:41的发言:
我要的就是这样,但我只会写一级。我不会用递归。请帮忙指点。
你在一楼提供的源代码,只有一个函数,没有 变量定义,没有对象定义,更没有 数据库连接代码。
这部分,我也不想补了。就取你在 5楼 提供的数据进行 替换 操作好啦。
凡是 替代 的部分,你自己想办法增加进去吧。
代码如下:
程序代码:
Private Type 替代返回结构
OwnerName As String
PINo As String
ApproveStatus As String
End Type
Dim keylist() As String '保存 KEY 列表
Private Sub Form_Load()
ReDim keylist(10000) '这个值定义的大一些
Dim key As String, text As String
Dim node2 As Node, node1 As Node
Dim r As 替代返回结构
'以下代码只实现了一级
'因未提供 MYCON 这个对象,所以原代码无法直接测试,使用替代法测试
'产生根
key = "All PI Owner Name"
text = "All PI Owner Name"
TreeView1.LineStyle = tvwTreeLines
'TreeView1.ImageList = ImageList1 如果你需要加图像,在这里绑定,在每个添加时指定图标
Set node1 = TreeView1.Nodes.Add(, tvwFirst, key, text) '根
r = readdate
Do
'第一级
If Not findkey(r.OwnerName) Then '如果 OwnerName 不存在,则添加
Set node1 = TreeView1.Nodes.Add(key, tvwChild, r.OwnerName, r.OwnerName)
End If
'第二级
If Not findkey(r.PINo) Then '如果 tvwChild 不存在,则添加
Set node1 = TreeView1.Nodes.Add(r.OwnerName, tvwChild, r.PINo, r.PINo)
End If
'第三级
'ApproveStatus 都必须添加进去的,ApproveStatus的值有重复,所以KEY需要再加上 Pinno上去,如果还有重复,那就继续添加 OwnerName 上去
Set node1 = TreeView1.Nodes.Add(r.PINo, tvwChild, r.PINo & r.ApproveStatus, r.ApproveStatus)
r = readdate '读下一个
Loop While r.PINo <> "" '替代函数里规定,读完数据后就返回空白
End Sub
Private Function findkey(cs As String) As Boolean '返回是否存在这个KEY
Dim i As Long
Static keycont As Long
findkey = False '假设为假
For i = 1 To keycont '查找
If keylist(i) = cs Then '找到
findkey = True '真
Exit For '退出循环
End If
Next i
If Not findkey Then '如果为假
keycont = keycont + 1 '计数+1
If keycont > UBound(keylist) Then '如果数组没空间了
ReDim Preserve keylist(keycont + 100) '扩大空间100
End If
keylist(keycont) = cs '保存KEY
End If
End Function
Private Function readdate() As 替代返回结构
'测试用替代函数,用来返回指定数据,以结构返回。
Static i As Long
'Const TT = "Danny_yu,20120327162823,Open,Danny_yu,20120327165603,Close,Danny_yu,20120327173503,Close,Danny_yu,20120328234303,Open,Danny_yu,20120329110003,close,yukp_yu,20120327171203,Close,yukp_yu,20120328225203,Open,yukp_yu,20120329170403,close"
'做了一个 重复的 PINo 值,但不重复的 ApproveStatus
Const TT = "Danny_yu,20120327162823,Open,Danny_yu,20120327162823,Close,Danny_yu,20120327173503,Close,Danny_yu,20120328234303,Open,Danny_yu,20120329110003,close,yukp_yu,20120327171203,Close,yukp_yu,20120328225203,Open,yukp_yu,20120329170403,close"
If i = 0 Then
Static fj() As String
fj = Split(TT, ",")
End If
i = i + 1
If i <= 8 Then
readdate.OwnerName = fj(i * 3 - 3)
readdate.PINo = fj(i * 3 - 2)
readdate.ApproveStatus = fj(i * 3 - 1)
End If
End Function