昨天在做一个 ASP 项目时,需要以树状显示对象及子对象的包含关系。鼓捣了一下,写出一个基本完善的算法。显示效果如下:
wsrwe
├ cccc
│ ├ aaaa
│ │ └ eeeee
│ ├ dddd
│ └ ddddd
└ testmember
刚好这是一个典型的树,含一个、两个、三个子节点的节点都存在。
这是一个递归算法,理论上可以输出无限层级的树。当前使用了一个配置属性 conRefererDepth 限制输出层级(取 0 时不限层级)。
<%
Dim dict
Set dict = Server.CreateObject("Scripting.Dictionary")
If Err Then Call Message("CreateObject failed")
Call GetReferer(0, lngMembership)
Set dict = Nothing
Sub GetReferer(level, id)
' Get Referers of the specified membership using recursion. by janlay
' PARAM level : level of current call
' PARAM id : membership id
If conRefererDepth > 0 And level >= conRefererDepth Then Exit Sub
Dim arr, i, j, str
Set rs = conn.Execute("SELECT MembershipID, Name FROM ds_Membership WHERE ReferredMembershipID = "& id &" ORDER BY Name")
If rs.Eof Then
rs.Close
Else
arr = rs.GetRows()
rs.Close
dict.Item(level &"_max") = UBound(arr,2)
For i = 0 To UBound(arr,2)
dict.Item(level) = i
str = Empty
For j = 0 To level - 1
str = str & iif(dict(j) < dict(j &"_max"), "│", " ") & " "
Next
str = str & iif(i = UBound(arr,2), "└", "├")
Response.Write ""& str &" "& Server.HTMLEncode(arr(1,i)) &"
"& vbCrLf
Call GetReferer(level + 1, arr(0,i))
Next
End If
End Sub其他说明:
1. rs/conn已在外部定义
2. conn 连接已经打开
3. iif 是外部定义的函数,实现和 VB 中的 IIf 相同的功能
4. 首次调用此过程时 level 参数必须是 0
5. 本文作者是 janlay, 未经许可请勿转载