AreaID QuickKey AreaName Memo
01 hb 华北           
0101 bj 北京           
0102 hb 河北           
02 xb 西北           
0201 sx 陕西           
020101 xa 西安           
02010101 hx 户县           
02010102 caq 长安区           
020102 xy 咸阳           
02010201 qdq 秦都区
想用此表的数据添加到treeview中去,要求01,02是父节点,0101,0102是01的子节点,0201是02的子节点,020101,020102是0201的子节点.以此类推,全部添加到treeview中并显示出来AreaName字段中的内容,因为数据库中的数据不断变动,所以当程序运行时,是动态添加数据到treeview中的.学的不精,
请高手给予指点,十分感谢!!

解决方案 »

  1.   

    建议逐层添加结点。初始化treeview的时候。只添加两个结点01,02 
    01,02设置为结点key 
    1.添加根节点 ,并设置假设子节点 
    tv.Nodes.Add , , "r", "Root"  ‘key 设置为r 
    tv.Nodes.Add , , "d", "" 2.然后在tv_Expand函数中添加以后的 
    当tv expand的时候,删除当前所有节点的子节点(为了保证动态更新),然后添加点击 
    结点的子 
    节点 2.1如何删除当前节点的子节点 
       For i = Node.Children To 1 Step -1 
           tv.Nodes.Remove Node.Child.Index 
       Next i 2.2如何在数据库中寻找子节点 
    由于数字是不能作为key添加到tv中的,所以把数字前头加一个字符比如c.则子节点的 
    key变成了c01,c02.把真正的01,02...放在tag中 
    dim sTargetString as string   Do Until Node.Key = "r" 
          sTargetString  = sTargetString  & Node.tag 
          Set Node = Node.Parent 
      Loop 此时sTargetString中为所寻找的根目录比如你寻找北京,此时sTargentString存放的 
    是01。 2.2根据sTargetString中内容,寻找下一级子节点 
    sTargetString=sTargetString & "%" 
    sql="select AreaID,AreaName from tb where ( AreaID=LIKE '" & sTargetString & "' and len(AreaID)=(len(sTargetString)+1))" rs.open sql,conn,1,1 
    选出即为下一级子节点 2.3添加进入当前节点 
    tv.Nodes.Add node.key, tvwchild, "c" & rs.fields(0), rs.fields(1)  ‘key 设 
    置为r 2.4每添加一个结点都需要看一下是否还有孩子,如果有就添加一个虚拟结点在下面 
    dim sNewTarget as string 
    sNewTarget =sTargetString+rs.fields(0) 
    sql=...重复上面的查询,把sTargetString换成sNewTarget就好了。然后看新的 
    recordset.recordcount是否为0 
    Y:在新添加节点下add 虚拟结点 应该清楚了。自己做个实验 
    我这边试验通过了 
      

  2.   

    Private Sub showClass()
        Dim txtSQL As String
        Dim MsgText As String
        Dim rst As ADODB.Recordset
        Dim nodX As Object   txtSQL = "……"
        Set rst = ExecuteSQL(txtSQL, MsgText)    If Not rst.EOF Then
          Do While Not rst.EOF
              If rst("fdetail") = 0 Then
                    If Len(rst.Fields(0)) = 4 Then
                        Set nodX = TreeView1.Nodes.Add(, tvwChild, , , "book")
                        nodX.Key = "A" & rst.Fields(0)
                        nodX.Text = rst.Fields(0) & "        " & rst.Fields(2)
                    Else
                        Set nodX = TreeView1.Nodes.Add(Left(("A" & rst.Fields(0)), 5), tvwChild, , , "man")
                        nodX.Key = "B" & rst.Fields(0)
                        nodX.Text = rst.Fields(0) & "        " & rst.Fields(2)
                    End If
              Else
                    If Len(rst.Fields(0)) = 9 Then
                        Set nodX = TreeView1.Nodes.Add(Left(("B" & rst.Fields(0)), 7), tvwChild, , , "mirror")
                        nodX.Key = "C" & rst.Fields(0)
                        nodX.Text = rst.Fields(0) & "        " & rst.Fields(2)
                    End If
            End If
    '       nodX.EnsureVisible
            rst.MoveNext
           Loop      
        End If
    End Sub
    这是我以前练习的一个小程序,不过功能只是把数据库中的数据显示在TreeView中,
    rst.Fields(0) 为代码,如你的 01、0101等,rst.Fields(2) 为名称,
    上下级节点的关系都是通过代码的长度来确定的;动态添加节点数据的功能,参考上面 MM 的作法……