建库的方法与: mornwoo(疾风之虫) 说的差不多,我记录了每个节点的key值,以及上级节点的key值我也用了递归,但是可能方法不对。我先搜索所有上级节点key值为root(跟节点的key)的节点,然后根据上级节点的key绘制第一个分支的所有节点,其中用到递归,这是成功的,但是只能绘制出第一个分支的所有第一个分支节点,就是说他的同级节点无法绘出。我考虑了一下,问题出在设计上面。由于每次绘制节点都是根据记录的上级节点的key值来确定该节点所处的位置,所以在使用递归的时候,相当于需要传入一个上级节点的key值参数,在递归的时候,这个参数一直在变化,所以当第一个分支全部绘制完成后,这个分支上所有的同级分支已经找不到自己上级分支的key值,所以无法绘制。我看是我设计上的问题。请大家给我一个好的遍历的方法,最好有代码。谢谢~~
每个节点分配一个独一无二的序号,从0 开始分配序号,先建的的节点,分配
的序号就小,这样按顺序加载就可以了!
如果你的程序还要提供节点移动功能,前面的设计是不行的,移动后会带来位置错乱,并导致加载变复杂。这种情况下,需要再单独建一个表,就两个字段,
按父节点子节点关系建立的唯一索引的表。
you_tab(id int,
name varchar2(50),
ref_id int);
即可,生成树时,也不需要第归。
'**************************
'名称 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
你可以用第归,但速度慢,你也可以完全不用第归。
首先建表 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