想把表中的分类用树形表示出来,一个大的类别里包含几个小类别,但是总实现不了,请大家帮帮忙。程序和表如下:
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

解决方案 »

  1.   

    "a" & rs.Fields("上级类别编号").Value, tvwChild, "a" & rs.Fields("编号").Value
    如果这两个是一样的就不能添加了
      

  2.   

    从你提供的代码来看,有以下几点存在问题:
    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的使用率。这可是我与人做商业软件时摸索来的哟。给分吧。