想把表中的分类用树形表示出来,一个大的类别里包含几个小类别,但是总实现不了,请大家帮帮忙。程序和表如下:
Dim conn As ADODB.Connection
Dim nodx As node
Private Sub Form_Load()
Dim str As String
Set conn = New ADODB.Connection
str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\dm.mdb;Persist Security Info=False"
conn.Open str
Call draw
End Sub
Sub draw()
TreeView1.Refresh
TreeView1.Nodes.Clear
TreeView1.BorderStyle = ccFixedSingle
Call outtree(0)
End Sub
Function outtree(i As Integer)
Dim m As Integer
Dim str1 As String
str1 = "select * from cs where 上级类别编号=" & i
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open str1, conn, 1, 1
m = rs.RecordCount
If i = 0 Then
Set nodx = TreeView1.Nodes.Add(, , "a" & rs.Fields("编号").Value, rs.Fields("类别名").Value, 1)
nodx.Expanded = True
Call outtree(rs.Fields("编号").Value)
Else
Do While Not rs.EOF
Set nodx = TreeView1.Nodes.Add("a" & rs.Fields("上级类别编号").Value, tvwChild, "a" & rs.Fields("编号").Value, rs.Fields("类别名").Value, 2)
nodx.Expanded = True
Call outtree(rs.Fields("编号").Value)
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
End Function表如下:
ID 层次 上级类别编号 编号 类别名
1 a001 0 1 网络中心机房配套设施
2 a001 0 2 机器设备
3 a001 0 3 电子设备
4 a001 0 4 办公设备
5 a001 0 5 工具器具
6 a001 0 6 文体用品
7 a001 0 7 办公桌椅
8 a001 0 8 电子设备耗材
9 a001 0 9 其他
10 a002 1 1 防雷设施
11 a002 1 2 配电设施
12 a002 1 3 监控设施
13 a002 1 4 灭火设施
14 a002 1 5 感应门禁
15 a002 1 6 其他
16 a002 2 1 发电机
17 a002 2 2 空调
18 a002 2 3 新风机
19 a002 2 4 充电设备
20 a002 2 5 其他
21 a002 3 1 台式计算机
22 a002 3 2 笔记本
23 a002 3 3 打印机
24 a002 3 4 网络设备
25 a002 3 5 终端机
26 a002 3 6 自动柜员机
27 a002 3 7 服务器
28 a002 3 8 移动硬盘
29 a002 3 9 UPS
30 a002 3 10 其他
31 a002 4 1 视频单频类
32 a002 4 2 空调
33 a002 4 3 饮水机
34 a002 4 4 碎纸机
35 a002 4 5 其他
36 a002 5 1 维修工具
37 a002 5 2 仪器仪表
38 a002 5 3 实用器具
39 a002 5 4 其他
40 a002 7 1 办公桌椅
41 a002 7 2 沙发
42 a002 7 3 茶几
43 a002 7 4 卷柜
44 a002 7 5 保险箱
45 a002 7 6 床
46 a002 7 7 其他
47
Dim conn As ADODB.Connection
Dim nodx As node
Private Sub Form_Load()
Dim str As String
Set conn = New ADODB.Connection
str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\dm.mdb;Persist Security Info=False"
conn.Open str
Call draw
End Sub
Sub draw()
TreeView1.Refresh
TreeView1.Nodes.Clear
TreeView1.BorderStyle = ccFixedSingle
Call outtree(0)
End Sub
Function outtree(i As Integer)
Dim m As Integer
Dim str1 As String
str1 = "select * from cs where 上级类别编号=" & i
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open str1, conn, 1, 1
m = rs.RecordCount
If i = 0 Then
Set nodx = TreeView1.Nodes.Add(, , "a" & rs.Fields("编号").Value, rs.Fields("类别名").Value, 1)
nodx.Expanded = True
Call outtree(rs.Fields("编号").Value)
Else
Do While Not rs.EOF
Set nodx = TreeView1.Nodes.Add("a" & rs.Fields("上级类别编号").Value, tvwChild, "a" & rs.Fields("编号").Value, rs.Fields("类别名").Value, 2)
nodx.Expanded = True
Call outtree(rs.Fields("编号").Value)
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
End Function表如下:
ID 层次 上级类别编号 编号 类别名
1 a001 0 1 网络中心机房配套设施
2 a001 0 2 机器设备
3 a001 0 3 电子设备
4 a001 0 4 办公设备
5 a001 0 5 工具器具
6 a001 0 6 文体用品
7 a001 0 7 办公桌椅
8 a001 0 8 电子设备耗材
9 a001 0 9 其他
10 a002 1 1 防雷设施
11 a002 1 2 配电设施
12 a002 1 3 监控设施
13 a002 1 4 灭火设施
14 a002 1 5 感应门禁
15 a002 1 6 其他
16 a002 2 1 发电机
17 a002 2 2 空调
18 a002 2 3 新风机
19 a002 2 4 充电设备
20 a002 2 5 其他
21 a002 3 1 台式计算机
22 a002 3 2 笔记本
23 a002 3 3 打印机
24 a002 3 4 网络设备
25 a002 3 5 终端机
26 a002 3 6 自动柜员机
27 a002 3 7 服务器
28 a002 3 8 移动硬盘
29 a002 3 9 UPS
30 a002 3 10 其他
31 a002 4 1 视频单频类
32 a002 4 2 空调
33 a002 4 3 饮水机
34 a002 4 4 碎纸机
35 a002 4 5 其他
36 a002 5 1 维修工具
37 a002 5 2 仪器仪表
38 a002 5 3 实用器具
39 a002 5 4 其他
40 a002 7 1 办公桌椅
41 a002 7 2 沙发
42 a002 7 3 茶几
43 a002 7 4 卷柜
44 a002 7 5 保险箱
45 a002 7 6 床
46 a002 7 7 其他
47
解决方案 »
- 在SSTab中动态添加控件
- 急需!!!!!VB用ADO访问sql2000简单举列。!!!!!!
- Split得到的数组与array定义的有区别???
- 使用WebBrowser, 请问如何在显示网页前把Javascript和图像去掉呢?
- 求救TTabDock(停靠控件)的使用方法,VSplitterBar控件的问题(急!!!!)
- 如何用修改注册表的方法实现本地目录的共享?
- 小弟我没有分数了,请帮我想一想,女生高考考什么专业比较适合呢?帮忙想一想?
- 用winsock控件做接收邮件,为什么总是提示"实时错误'40020' 当前状态的操作无效"?
- 如何用代码来绑定DBcombo控件的RowSource属性
- 有大连的朋友吗?
- vb打开窗口代码
- sstab控件的问题
如果这两个是一样的就不能添加了
1、库结构中关于字段的设置需要条理化。
编号只需1或2个字段,2个字段执行时少了许多判断语句,效率略高些,1个字段自不必说少占的存储空间。
自编号 上层编号 类别名
a001 网络中心机房配套设施
a001001 a001 防雷设施
若只设自编号一个编号,上面的结构改为
自编号 类别名
a001 网络中心机房配套设施
a001001 防雷设施2、条件语句中的变量i不明所以。以我来看,如果仅是单纯地添加全部记录直接使用循环语句即可,下面以2字段确定关系为例。
Do while Not rs.EOF if trim(rs.fields("上层编号").Value)=""'添加父节点
TreeView1.Nodes.Add , , rs.Fields("自编号").Value, rs.Fields("类别名").Value, 1)
else'添加子节点
TreeView1.Nodes.Add rs.Fields("上层编号").Value, tvwChild, rs.Fields("自编号").Value, rs.Fields
endiflooprs.Close
Set rs = Nothing '注意:1、若记录集宏大不要直接展开,否则将极大降低加载速度。
2、多层树可类推,但层数较多,记录多时,建议逐级加载。即在用户界面加载时只加载顶层节点,用户交互操作时,再根据用户点击的节点有选择的加载。这样一来,既可提高效率又降低的CPU的使用率。这可是我与人做商业软件时摸索来的哟。给分吧。