一个牵套循环的问题?

seasstar 2001-11-29 07:43:44
要求:
数据库为NODETEXT.MDB
tbl_node
:1.node_ID(节点ID,主键)
2.NodeName(节点名)
3.IsRoot(是否初始化节点,是-1,否0)
4.Parent_ID(上级节点ID)
住:Node_ID and Parent_ID为一对多关系

编程:
取TBL_NODE表的记录并以树状结构填充到TEXT BOX OR TREE VIEW中.
说明:
isroot为-1表示该记录为根,PARENT_ID 如果等于NODE_ID则PARENT_ID的记录是NODE_ID记录的子级.
如果在TEXT BOX 中显示根在最上其次为根的儿子接着是儿子的儿子...
...全文
94 11 打赏 收藏 转发到动态 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wesely 2001-11-30
  • 打赏
  • 举报
回复
我再说一次,我没装VB,我不是高手,手写代码很痛苦的。

不难实现的,你自己写一写吧。
seasstar 2001-11-30
  • 打赏
  • 举报
回复
我没有实现类。能帮忙做一下么?
Wesely 2001-11-29
  • 打赏
  • 举报
回复
假设你已经实现了类。

dim clt as LevelNodes

sub Refresh_List

dim lt as LevelNode

set clt = new LevelNodes
rs.Open "select * from T where IsRoot=-1",.......
if rs.eof then exit sub
rs.MoveFirst
do while not rs.eof
set lt= new LevelNode
lt.node_id=rs!node_id
lt.nodename=rs!node_name
lt.parentnode=-1
clt.Add -1, lt, lt.Node_ID
children lt.node_id
rs.movenext
loop
end sub


Private Sub children(node_id As Integer)

dim Child_id as Integer
dim TempNode as LevelNode
dim rst=new adodb.Recordset

rst.open "select * from .. where parent_id=" & node_id, ......
if rst.eof then exit sub
rst.movefirst
Do While Not rs.EOF
Child_id = rst.Fields("node_id")
set TempNode= new LevelNode
TempNode.node_id=rs!node_id
TempNode.nodename=rs!node_name
TempNode.parentnode=node_id
clt.Add(node_id, TempNode, TempNode.Node_id)
children TempNode.Node_id
rst.movenext
Loop
set rst=nothing

End Sub
seasstar 2001-11-29
  • 打赏
  • 举报
回复
数据库为:
Node_ID NodeName IsRoot Parent_ID
1 aaa -1
2 bbb 0 1
3 ccc 0 1
4 ddd 0 2
5 eee -1
6 fff 0 3
7 ggg 0 6
8 hhh 0 5
9 jjj 0 7
...
...
seasstar 2001-11-29
  • 打赏
  • 举报
回复
第二个类模块是LEVELNODES
seasstar 2001-11-29
  • 打赏
  • 举报
回复
node_id and parent_id 是一对多的关系
两位能把代码写全点么?
这是我的一个应聘试题。多谢!
他们还要求要做一个集合类,接口信息:
1.levelnode
node_id
nodename
nodechildren
parentnode
2.levelnode
count
item
add([relatekey as string],[objlevelnode as levelnode],[skey as string]) as levelnode (方法 增加)
参数说明:
Relatekey 上级对象在集合中的KEY
objlevelnode 要加入集合的对象
SKEY 在集合中的KEY

Wesely 2001-11-29
  • 打赏
  • 举报
回复
rst.open "select * from .. where "parent_id=" & node_id, ......
更正为
rst.open "select * from .. where parent_id=" & node_id, ......
Wesely 2001-11-29
  • 打赏
  • 举报
回复
对不起,我这里没装VB,无法帮你调试。


Private Sub children(node_id As Integer, intParent as Integer)

dim Child_id as Integer
dim tvItem as Node
dim rst=new adodb.Recordset


rst.open "select * from .. where "parent_id=" & node_id, ......
rst.movefirst
Do While Not rs.EOF
Child_id = rst.Fields("node_id")
set tvItem=tvXXX.Add(rst.Fields("nodename"),tvwchild,intParent)
'我记不清Add的参数了
'intParent指明父节点
Call children(Child_id, tvItem.Index)
set tvitem=nothing
rst.movenext
Loop
set rst=nothing

End Sub



seasstar 2001-11-29
  • 打赏
  • 举报
回复
不太明白?能说的具体点么?我自己写了一个请帮忙改正。
Dim clt As New collenction
Dim cnn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim pt As Integer

Private Sub Command1_Click()
Dim record As String
Dim node_id As String
Dim nodename As String
Dim nodechildren As Long
Dim parentnode As String
Dim i%, j%, n%, k%
rs.MoveLast
rs.MoveFirst
pt = 1
node_id = rs.Fields("node_id")
Do While Not rs.EOF
If node_id = rs.Fields("parent_id") Then
clt.Add rs.Fields("nodename")
j = j + 1
Call children(node_id, j)
End If
If pt < rs.RecordCount Then
pt = pt + 1
rs.MoveNext
Else
Exit Do
End If
Loop
For Each clt In clt.Count
Text1.Text = Text1.Text & clt.Item(i)
Next
End Sub
Private Sub children(node_id As String, j%)
Dim i%, k%
Dim a$, b$, C$
Set clt = New Collection
rs.MoveFirst
pt = 1
Do While Not rs.EOF
If node_id = rs.Fields("parent_id") Then
node_id = rs.Fields("node_id")
j = j + 1
clt.Add rs.Fields("nodename")
Call children(node_id, j)
pt = 1
rs.MoveFirst
Else
End If
pt = pt + 1
rs.MoveNext
Loop
clt.Add rs.Fields("nodename")
End Sub

Private Sub Form_Load()
Set cnn = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
cnn.Open "provider=microsoft.jet.oledb.4.0;data source=c:\my documents\nodetest.mdb"
With rs
.ActiveConnection = cnn
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "select * from tbl_node"
End With
Set clt = New Collection
End Sub

mmzxg 2001-11-29
  • 打赏
  • 举报
回复
hehe,对列,又给WESELY你快一步列
Wesely 2001-11-29
  • 打赏
  • 举报
回复
Node_ID and Parent_ID应该为多对一的关系吧?
用递归吧。

sub Refresh_List

清空TreeView
寻找isroot=-1的记录,intNode=它的Node_ID,添加到TreeView。
AddN(intNode)

end sub

sub AddN(byval intA as Integer)
dim bFound as Boolean
do
寻找Parent_ID=intA的记录,
if found then
bFound=True
intNodeTemp=它的Node_ID,添加到TreeView。
AddN(intNodeTemp)
else
bFound=False
endif
loop until not bFound
end sub

7,703

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告