这个论题很老了。
下面大致上是个比较完整的Demo,半夜完成。(asp的Dim声明的弱类型变量确实不好调试)
Windows 2000 Professinal+ Access调试通过。
定义数据库表tTest,字段TestID, TestContent, ParentID,追加如下纪录
testID | testContent | ParentID | |
---|---|---|---|
3 | 首1 | 0 | |
4 | 首2 | 0 | |
5 | 首3 | 0 | |
6 | 子11 | 3 | |
7 | 子12 | 3 | |
8 | 子111 | 6 | |
9 | 子112 | 6 | |
10 | 子1111 | 8 | |
11 | 子114 | 6 | |
12 | 子113 | 6 | |
13 | 子1112 | 8 |
代码如下:
<% Option Explicit %>
<!--#include file="./inc/conn.asp"-->
<!--#include file="./inc/strFunction.asp"-->
<%
CreateConnection(GetDBPath("./")) '与Access创建连接
'获取多维数组数据
Dim rs
Dim strSQL
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "Select * from tTest order by testID"
Dim arrTmp()
rs.Open strSQL, conn, 1, 1
If not rs.EOF or rs.BOF Then
Dim i
i = 0
ReDim arrTmp(rs.RecordCount-1, 2)
While not rs.EOF
arrTmp(i,0) = trim((rs("testID")))
arrTmp(i,1) = trim((rs("testContent")))
arrTmp(i,2)=trim((rs("ParentID")))
i = i +1
rs.MoveNext
Wend
End If
freeDBObject(rs)
'遍历数组,打印节点
Dim CurrentParentID, LastID, vSpace, LastParentID
vSpace ="|"
LastID = -1
LastParentID = -1
Function PrintNode(ParentID)
Dim i
For i=0 to UBound(arrTmp, 1)
If Cint(arrTmp(i, 2))=ParentID Then
CurrentParentID = ParentID
'显示:相当于处理完成
If CurrentParentID = LastID Then '如果当前的父ID等于前一个ID说明是前一个的子节点,需要增加标识符,
vSpace = vSpace & "--"
Elseif CurrentParentID <> LastParentID Then '如果当前的父ID不等于前一个ID并且此两连续节点的父节点不同,则表明不是同一层节点,需去掉一个标识符
vSpace = Replace(vSpace , "--","",1,1)
End If
Response.Write vSpace&" Current ParentID:"&ParentID&",Title: "& arrTmp(i, 1)&" ,CurrentID:"&arrTmp(i,0)&"<br>"
LastID = Cint(arrTmp(i,0)) '当前ID值保留
LastParentID = ParentID '当前父节点ID保留
PrintNode(Cint(arrTmp(i, 0)))
End If
Next
End Function
'遍历数组,取某节点的父路径
Dim ParentPath
Function GetNodePath(NodeID)
Dim i, ParentID
'取当前节点的父ID
For i=0 to UBound(arrTmp,1)
If Cint(arrTmp(i, 0))=NodeID Then
ParentID = Cint(arrTmp(i, 2))
ParentPath = Cstr(ParentID) + ","+ ParentPath
GetNodePath(ParentID)
End If
Next
End Function
PrintNode(3) '打印ParentID为3的所有节点
Response.Write "<p>"
ParentPath = "11"
GetNodePath(11)
Response.Write "11"'""&" ParentPath "ParentPath &"<br>"
freeDBObject(conn)
%>
浏览器显示如下:
| Current ParentID:3,Title: 子11 ,CurrentID:6
|-- Current ParentID:6,Title: 子111 ,CurrentID:8
|---- Current ParentID:8,Title: 子1111 ,CurrentID:10
|---- Current ParentID:8,Title: 子1112 ,CurrentID:13
|-- Current ParentID:6,Title: 子112 ,CurrentID:9
|-- Current ParentID:6,Title: 子114 ,CurrentID:11
|-- Current ParentID:6,Title: 子113 ,CurrentID:12
| Current ParentID:3,Title: 子12 ,CurrentID:7
11's ParentPath 0,3,6,11