我用treeview这个控件,我读数据库先把父节点全部列入tree中,然后想点击某个节点,再读一次库把属于这个节点下的子节点列出来!我这样写的 ,但程序执行后第二次读库列出的子节点也写到了父节点目录下了!帮我看看怎么改啊!
Private Sub form_load()
TreeView1.Nodes.Clear
    TreeView1.LineStyle = tvwRootLines  ' Linestyle 1
    sql = "select * from MainDept"
    Set rs = New ADODB.Recordset
    rs.Open sql, conn, 3, 3
    Do While Not rs.EOF
        rname = rs("Department")
     Set nodX = TreeView1.Nodes.Add(, , rid, rname)
    nodX.ForeColor = QBColor(2)
    rs.MoveNext
     Loop
     rs.Close
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
 Dim s As String
 Dim dname As String
 Dim sql As String
 s = TreeView1.HitTest(x, y)
 sql = "select * from Dept where MOfDept='" & s & "' "
    Set rs = New ADODB.Recordset
    rs.Open sql, conn, 3, 3
    Do While Not rs.EOF
        dname = rs("NameOfDept")
     Set nodX = TreeView1.Nodes.Add(, s, , dname)
    nodX.ForeColor = QBColor(2)
    rs.MoveNext
     Loop
     rs.Close
End Sub
很急啊!帮我看看好吗

解决方案 »

  1.   

    建议在MSDN上好好查一查TreeView1.Nodes.Add 方法的用法
      

  2.   

    Add 方法(Nodes 集合)
          在 Treeview 控件的 Nodes 集合中添加一个 Node 对象。语法object.Add(relative, relationship, key, text, image, selectedimage)Add 方法的语法包含下面部分:部分 描述 
    object 必需的。对象表达式,其值是“应用于”列表中的一个对象 
    relative 可选的。已存在的 Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。 
    relationship 可选的。指定的 Node 对象的相对位置,如设置值中所述。 
    key 可选的。唯一的字符串,可用于用 Item 方法检索 Node。 
    text 必需的。在 Node 中出现的字符串。 
    image 可选的。在关联的 ImageList 控件中的图像的索引。 
    selectedimage  可选的。在关联的 ImageList 控件中的图像的索引,在 Node 被选中时显示。 
    设置值relationship 的设置值是:常数 值 描述 
    tvwFirst 0 首的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之前。 
    tvwLast 1 最后的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后 
    tvwNext 2 (缺省)下一个节点。该 Node 位于在 relative 中被命名的节点之后。 
    tvwPrevious 3 前一个节点。该 Node 位于在 relative 中被命名的节点之前。 
    tvwChild 4 (缺省)子节点。该 Node 成为在 relative 中被命名的 
    节点的子节点。
     
    注意 如果在 relative 中没有被命名的 Node 对象,则新节点被放在节点顶层的最后位置。说明Nodes 集合是一个基于 1 的集合。在添加 Node 对象时,它被指派一个索引号,该索引号被存储在 Node 对象的 Index 属性中。这个最新成员的 Index 属性值就是 Node 集合的 Count 属性的值。因为 Add 方法返回对新建立的 Node 对象的引用,所以使用这个引用来设置新 Node 的属性十分方便。以下例子添加几个具有相同属性的 Node 对象:Dim nodX As Node   '声明对象变量。
    Dim I as Integer   '声明计数器变量。
    For I = 1 to 4
       Set nodX = TreeView1.Nodes.Add(,,,"Node " & Cstr(i))
       '使用引用来设置其它属性,如 Enabled。
       nodX.Enabled = True
       '把图像属性设置为在关联的 ImageList 中的图像 3。
       nodX.ExpandedImage = 3
    Next I
      

  3.   

    这么做不好,用鼠标点击才列出来,强烈推荐在初始化时就全部加进去。你这样很容易出错,比较混乱。给你的例子看。
    Private Sub TestView()Set mcnn = New ADODB.Connection
    mcnn.Open "provider=Microsoft.jet.oledb.4.0;persist security info=false;data source=" & App.Path & "\inc\mm.mdb"
    Set rs = New ADODB.Recordset
    Set nodX = tvwTest.Nodes.Add(, , "r", "心理测量系统")TestViewList "r1", "智力类"
    TestViewList "r2", "情感类"
    TestViewList "r3", "健康类"
    TestViewList "r4", "个性类"
    TestViewList "r5", "能力类"
    TestViewList "r6", "职业类"mcnn.Close
    End SubPrivate Sub TestViewList(root As String, name As String)sql = "select 名称 from " & name
    rs.Open sql, mcnn, , , adCmdTextSet nodX = tvwTest.Nodes.Add("r", tvwChild, root, name)
    nodX.EnsureVisible
    Do While Not rs.EOF
    Set nodX = tvwTest.Nodes.Add(root, tvwChild, , rs("名称"))
    rs.MoveNext
    Loop
    rs.CloseEnd Sub
      

  4.   

    MSDN帮助
    语法object.Add(relative, relationship, key, text, image, selectedimage)Add 方法的语法包含下面部分:部分 描述 
    object 必需的。对象表达式,其值是“应用于”列表中的一个对象 
    relative 可选的。已存在的 Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。 
    relationship 可选的。指定的 Node 对象的相对位置,如设置值中所述。 
    key 可选的。唯一的字符串,可用于用 Item 方法检索 Node。 
    text 必需的。在 Node 中出现的字符串。 
    image 可选的。在关联的 ImageList 控件中的图像的索引。 
    selectedimage  可选的。在关联的 ImageList 控件中的图像的索引,在 Node 被选中时显示。 你的原因是没有指定添加到的父节点,还有最好不要Private Sub TreeView1_MouseDown,而用Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)来完成展开动态加载
      

  5.   

    举例说明:Dim nodX As Node
    Dim nodX1 As Node
    Dim nodX2 As Node
    Set nodX = tvwMyTree.Nodes.Add(,,,"Root")    ' 增加root接点
    Set nodX1 = tvwMyTree.Nodes.Add(nodX.index,tvwChild,"Child")    '增加一个child接点
    Set nodX2 = tvwMyTree.Nodes.Add(nodX1.index,tvwChild,"ChildChild")    '增加一个child的child接点
      

  6.   

    你的添加节点部分可能出错了。'添加一个父节点
    Set nodX=Treeview1.Nodes.Add(,,"父节点的关键字","父节点")
    '添加子节点
    Set nodX=Treeview1.Nodes.Add("父节点的关键字",tvwChild,"子节点1的关键字","子节点1")
    Set nodX=Treeview1.Nodes.Add("父节点的关键字",tvwChild,"子节点2的关键字","子节点2")
    尤其注意添加子节点的前两个参数,第一个是父节点关键字,第二个是与它的关系(child)。
    object.Add(relative, relationship, key, text, image, selectedimage)
    同理,如果要在子节点1下再添加节点,就Set nodX=Treeview1.Nodes.Add("子节点1的关键字",tvwChild,"孙节点1的关键字","孙节点1")
      

  7.   

    不建议你一开始就全都加进去,因为Node的个数不能超过32767个,最好动态的添加删除。
      

  8.   

    建议最好也一开始全部加入。
    分开加入的办法:
    首先通过点击根节点获得根节点的key值及名称(可以通过RKey=treeview1.nodes.selectitem.key和treeview1.nodes.selectitem.text获得)然后可以用
    treeview.nodes.add RKey,tvwChild,RKey &i,"ChildName"& i
    即可实现