表名:k0
ID    bh    mc
1      0    江西省
2      0    浙江省
3      0    湖南省
4      1    南昌市
5      1    九江市
6      2    宁波市
7      3    杭州市
8      4    西湖区
9      4    东湖区上面是表结构,要用treeview生成下面的格式:
江西省
    南昌市
        西湖区
        东湖区
    九江市
浙江省
    宁波市
    杭州市
湖南省
---------------------- 
BH中跟ID号相等的,即是ID号的下级.

解决方案 »

  1.   

    根据上面的问题,还有另外一个问题:
    表名:K1
    BH     XM     ADDRESS
    101    张三    西湖区
    102    李四    东湖区
    201    王五    九江市
    301    赵六    宁波市
    401    刘七    湖南省
    ----------------------也利用treeview生成如下结构
    江西省
        南昌市
            西湖区
                101   张三
            东湖区
                102   李四
        九江市
            201  王五
    浙江省
        宁波市
            301  赵六
        杭州市
    湖南省
        401 刘七
    -------------------------
    最好能实现增加,修改,删除组别,和增加人员功能
      

  2.   

    三个记录集、三重循环~SQL语句熟吧?
    取出bh=0的所有记录,在根节点下添加节点,第一重循环;
    对每一条记录,取所有bh=本记录ID的记录,添加到当前节点下,第二重循环;
    第三重循环同理
      

  3.   

    Dim nodX As Node
       Set nodX = TreeView1.Nodes.Add(, , "r", "Root")'添加根节点   '在r下面添加子节点
       Set nodX = TreeView1.Nodes.Add("r", tvwChild, "child1", "Child")'第三个参数是key,第四个为显示文本
      

  4.   

    用SQL语句我试过了,第一重我做好了,第二重却不知道该怎么做.
      

  5.   

    做个循环。sql语句只是要取出每层显示的数据
      

  6.   

    我的代码只分三层,你的好象有四层,自己作了,
    哪位大哥能帮我优化一下吗?感觉应该能做的更简单一些
    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim key, text, connstr, rsstr1, rsstr2, rsstr3 As String
    Dim a(), b() As String
    Dim i, j, k, l, h, m, n, y As Integer
    connstr = "..............."
    rsstr1 = "select distinct zzmm from rsdtxx where zzmm<>'' "
    rsstr2 = "select distinct sszb,zzmm from rsdtxx where sszb<>''"
    rsstr3 = "select xm,sszb,zzmm from rsdtxx"
    conn.Open connstrTreeView1.LineStyle = tvwTreeLines '在兄弟节点和父节点之间显示线
      'TreeView1.ImageList = ImageList1 链接图像列
      TreeView1.Style = tvwTreelinesPlusMinusPictureText
      '树状外观包含全部元素
    dl = "全部人员"
    Set nodx = TreeView1.Nodes.Add(, , dl, dl)rs.Open rsstr1, conn
    i = 0
    Do While Not rs.EOF
         
         key = Trim(rs.Fields("zzmm"))
         text = Trim(rs.Fields("zzmm"))
         Set nodx = TreeView1.Nodes.Add(dl, tvwChild, key, text)
         rs.MoveNext
         i = i + 1
    Loop
    j = i
    rs.MoveFirst
    ReDim a(0 To j)
    k = 0
        Do While Not rs.EOF
          a(k) = Trim(rs.Fields("zzmm"))
          k = k + 1
          rs.MoveNext
        Loop
    l = k
    rs.Closers.Open rsstr2, conn
    i = 0
       Do While Not rs.EOF
         For k = 0 To l
          If rs.Fields("zzmm") = a(k) Then
           key = Trim(rs.Fields("sszb"))
           text = Trim(rs.Fields("sszb"))
           Set nodx = TreeView1.Nodes.Add(a(k), tvwChild, key, text)
          End If
         Next
         rs.MoveNext
         i = i + 1
       Loop
    y = i
    n = y
    rs.MoveFirst
    ReDim b(0 To n)
    h = 0
        Do While Not rs.EOF
           b(h) = Trim(rs.Fields("sszb"))
           rs.MoveNext
           h = h + 1
        Loop
    m = h
    rs.Closers.Open rsstr3, conn
    Do While Not rs.EOF
    If IsNull(rs.Fields("sszb")) = True Then
       For k = 0 To j
          If rs.Fields("zzmm") = a(k) Then
             key = Trim(rs.Fields("xm"))
             text = Trim(rs.Fields("xm"))
             Set nodx = TreeView1.Nodes.Add(a(k), tvwChild, key, text)
             Exit For
          
          End If
       Next
    Else
       For k = 0 To j
           If rs.Fields("zzmm") = a(k) Then
             For h = 0 To n
                If rs.Fields("sszb") = b(h) Then
                   key = Trim(rs.Fields("xm"))
                   text = Trim(rs.Fields("xm"))
                   Set nodx = TreeView1.Nodes.Add(b(h), tvwChild, key, text)
                   Exit For
                
                End If
             Next
            
           
           End If
       Next
    End If
    rs.MoveNext
    Loop
    rs.Close
    conn.CloseTreeView1.Refresh
      

  7.   

    谁知道他这数据绘有几层,用先序遍历算法插入节点吧。
    Public Function 插入节点(byval 父节点 as Integer)
    1、从DB中取出父节点下子节点
    2、在Key为父节点下插入子节点
    3、循环子节点,递归调用该方法
       for i=1 to 自节点数
          Call 插入节点(子节点(i))
       next i
    End Function
      

  8.   

    谢谢楼上各位大哥的指点.第一个问题我解决了.不管有多少层可以自动增加上去,我用了两个函数.一个增加父结点,一个增加子结点.利用循环就搞定了.现把代码贴上来.
    Private Sub Command1_Click()
     Dim s As String
     Dim str As String
     If trv.SelectedItem Is Nothing Then Exit Sub
     s = Mid(trv.SelectedItem.Key, InStr(1, trv.SelectedItem.Key, "_") + 1)
     
     str = InputBox("请输入要增加的部门名称:", "增加子部门")
     If str <> "" Then
        If s = "boot" Then
           conn.Execute "insert into sys000(bh,mc) values ('0','" & str & "')"
        Else
           conn.Execute "insert into sys000(bh,mc) values('" & s & "','" & str & "')"
        End If
        
     End If
     loaddata
    End Sub
    ----Module1模块-----
    Public conn As New ADODB.Connection
    Public rs As New ADODB.Recordset
    Public Sub main() conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + App.Path + "\data.mdb" + "';Persist Security Info=False"
     rs.Open "select * from sys000", conn, 3, 3
     
    End SubPrivate Sub Command1_Click()
     Dim s As String
     Dim str As String
     If trv.SelectedItem Is Nothing Then Exit Sub
     s = Mid(trv.SelectedItem.Key, InStr(1, trv.SelectedItem.Key, "_") + 1)
     
     str = InputBox("请输入要增加的部门名称:", "增加子部门")
     If str <> "" Then
        If s = "boot" Then
           conn.Execute "insert into sys000(bh,mc) values ('0','" & str & "')"
        Else
           conn.Execute "insert into sys000(bh,mc) values('" & s & "','" & str & "')"
        End If
        
     End If
     loaddata
    End SubPrivate Sub Command2_Click()
     Dim s As String
     If trv.SelectedItem Is Nothing Then Exit Sub
     s = Mid(trv.SelectedItem.Key, InStr(1, trv.SelectedItem.Key, "_") + 1)
     If MsgBox("确定要删除该部门吗?", vbQuestion + vbYesNo) = vbYes Then
        If Not trv.SelectedItem Is Nothing Then
          If trv.SelectedItem.Children = 0 Then
             conn.Execute "delete from sys000 where id=" & s & ""
          End If
        End If
        
     End If
     loaddata
    End SubPrivate Sub Command3_Click()
     Set rs = conn.Execute("select sys000.ID,sys001.xm,sys001.nl from sys000,sys001 where sys000.id=sys001.bh")
     loaddata
    End SubPrivate Sub Form_Load()
     main
     Set rs = conn.Execute("select * from sys000")
     loaddata
    End Sub
    Sub AddRootNode(Root_Key As String, str_Key As String, str_Name As String)
        Dim ndNewNode As Node
        Set ndNewNode = trv.Nodes.Add(Root_Key, tvwChild, "K_" & str_Key, str_Name)
        ndNewNode.Expanded = True
      
    End SubSub AddChildNode(Child As String, Child_key As String, str_Name As String)
        Dim ndNewNode As Node
        Set ndNewNode = trv.Nodes.Add(Child, tvwChild, Child_key, str_Name)
        ndNewNode.Expanded = True
    End SubPublic Sub loaddata()
     Dim Node As Node
     
     Dim I As Integer
     Dim str_Key As String
     Dim str_Name As String
     trv.Nodes.Clear
     Set Node = trv.Nodes.Add(, , "boot", "客户分类列表")
     
     Do Until rs.EOF
         str_Key = rs.Fields(0) 'ID
         str_Name = rs.Fields(2) 'MC
         If rs.Fields(1) = 0 Then 'BH
            Call AddRootNode("boot", str_Key, str_Name) '增加父结点
         Else
            str_Key = rs.Fields(1)
            Call AddChildNode("K_" & str_Key, "K_" & rs.Fields(0), str_Name)
         End If
         rs.MoveNext
     Loop
     Node.Expanded = TrueEnd SubPrivate Sub trv_DblClick()
      If Not trv.SelectedItem Is Nothing Then
          '只响应叶节点(没有孩子)
          If trv.SelectedItem.Children = 0 Then
             MsgBox trv.SelectedItem.Key & "  " & trv.SelectedItem.Text
          End If
        End If
    End Sub
      

  9.   

    表结构:
    SYS000:
    ID BH   MC
    1 0 江西省
    2 0 浙江省
    3 0 湖北省
    4 0 湖南省
    5 0 安徽省
    6 1 南昌市
    7 1 九江市
    8 1 新余市
    9 1 赣州市
    10 2 杭州市
    11 2 宁波市
    12 3 武汉市
    13 3 咸宁市
    14 4 衡阳市
    15 4 长沙市
    16 6 西湖区
    17 6 东湖区
    18 15 东阳区
    19 7 浔阳区
    SYS001:
    BH XM NL
    16 李振格 12
    16 李幼哲 23
    16 黄娟娟 34
    5 周海鹏 23
    5 王冬 33
    19 许振伍 53
    19 吕建忠 23
    12 段兴 34
    12 吴德胜 35
    17 肖仁华 32
    17 齐晓亮 34
    ----------------------------------
    第一个问题我搞定了,现在第二个问题还没有搞定,要把sys001的人员增加到结点中.不知道该怎么办?
    我的思路是跟第一题一样,通过结点增加上去,但还不知道代码该如何组织??望各位大哥再指点一下.