建库的方法与: mornwoo(疾风之虫) 说的差不多,我记录了每个节点的key值,以及上级节点的key值我也用了递归,但是可能方法不对。我先搜索所有上级节点key值为root(跟节点的key)的节点,然后根据上级节点的key绘制第一个分支的所有节点,其中用到递归,这是成功的,但是只能绘制出第一个分支的所有第一个分支节点,就是说他的同级节点无法绘出。我考虑了一下,问题出在设计上面。由于每次绘制节点都是根据记录的上级节点的key值来确定该节点所处的位置,所以在使用递归的时候,相当于需要传入一个上级节点的key值参数,在递归的时候,这个参数一直在变化,所以当第一个分支全部绘制完成后,这个分支上所有的同级分支已经找不到自己上级分支的key值,所以无法绘制。我看是我设计上的问题。请大家给我一个好的遍历的方法,最好有代码。谢谢~~

解决方案 »

  1.   

    你本,不用递归!不用保存上级的key值!
      每个节点分配一个独一无二的序号,从0 开始分配序号,先建的的节点,分配 
      的序号就小,这样按顺序加载就可以了!
      如果你的程序还要提供节点移动功能,前面的设计是不行的,移动后会带来位置错乱,并导致加载变复杂。这种情况下,需要再单独建一个表,就两个字段,
      按父节点子节点关系建立的唯一索引的表。
      
      

  2.   

    太简单了
      you_tab(id int, 
              name varchar2(50),
              ref_id int);
    即可,生成树时,也不需要第归。
      

  3.   

    下面的是我的组员写的公用树图加载代码,看看把!
    '**************************
    '名称     sub_treeviewload
    '作者   lhy 2001-05-10
    '功能    Treeview 数据加载
    '参数    sTableName   操作表名称
    '**************************
    Sub sub_treeviewload(sTableName As String)
     Dim OAdoRst As New adodb.Recordset
     Dim sTmpfieldupno
     Dim sTmpfieldno
     Dim sStr
    On Error GoTo Morn
     OAdoRst.Open sTableName, goConnect, adOpenKeyset, adLockOptimistic
      sTmpfieldno = OAdoRst.Fields(1).name
      sTmpfieldupno = OAdoRst.Fields(3).name
      OAdoRst.Close
      OAdoRst.Open "select * from " & sTableName & " order by  " & sTmpfieldupno & " , " & sTmpfieldno, goConnect, adOpenKeyset, adLockOptimistic
      If OAdoRst.BOF And OAdoRst.EOF Then
           With Screen.ActiveForm.trv
             sStr = .Nodes("K0").Text
             .Nodes.Clear
             .Nodes.Add , , "K0", sStr, 3
          End With
          Exit Sub
      End If
      OAdoRst.MoveFirst
      With Screen.ActiveForm.trv
            sStr = .Nodes("K0").Text
           .Nodes.Clear
           .Nodes.Add , , "K0", sStr, 3
           Do While Not OAdoRst.EOF
            Dim Sql As String
            .Nodes.Add "K" & Trim(str(OAdoRst.Fields(3))), tvwChild, "K" & OAdoRst.Fields(1), OAdoRst.Fields(0) & "" & OAdoRst.Fields(2) & "", 1
            .Nodes("K" & OAdoRst.Fields(1)).Tag = OAdoRst.Fields(0)
            OAdoRst.MoveNext
           Loop
      .Nodes(.Nodes.Count).EnsureVisible
      If .Nodes.Count > 1 Then .Nodes(2).Selected = True
         .Nodes(1).Selected = True
      End With
      OAdoRst.Close
      Set OAdoRst = Nothing
    Exit Sub
    Morn:
      MornSubs.sub_ErrCenter False
    End Sub
    附某树图表结构:CREATE TABLE [dbo].[WKDInfo] (
    [SWKDCode] [nvarchar] (20) NOT NULL ,--节点key值编码
    [IWKDNo] [smallint] NOT NULL ,      --节点序号
    [SWKDName] [nvarchar] (20) NOT NULL ,--节点名称
    [IupWKDNo] [smallint] NOT NULL        --节点上级序号
    )
    GO
      

  4.   

    唉,建树由什么难得。
    你可以用第归,但速度慢,你也可以完全不用第归。
    首先建表 tab(id int, name varchar2(50), ref_id int);按顺序选出所有记录,保证上级节点数据排在前面
    select * from (select id,name ,ref_id,level level_id from tab start with r
    ef_id=0 connect by prior id=ref_id ) order by level_id asc;添加节点是,用id号佐关联信息即可。
    select * from (select id,name ,ref_id,level level_id from tab start with ref_id=0 connect by prior id=ref_id ) order by level_id asc;
    <vb>
    if rst!ref_id=0 then
      treeview1.nodes.add ,,rst!name,k & rst!id
    else
      treeview1.nodes.add  k & rst!ref_id,tvwchild,rst!name, k&rst!id
    endif