主题:关于类别菜单的问题。
crazys
[专家分:520] 发布于 2004-03-29 11:40:00
数据库中有如下字段:
n_ID, n_ParentID, vc_Name,分别是:自动编号,父级类别编号和类别名。我想生成如下菜单,内容已经用递归方法解决,可是这前缀我怎么也弄不好,谁能给个办法?
菜单样子:
第一级A
├第二级AA
│├第三级AAA
│└第三级AAB
└第二级B
第一级B
├第二级BA
│└第三级BAA
└第二级BB
├第三级BBA
│└第四级BBAA
└第三级BBB
我用的方法是:
function Menu(ParentID)
定义各变量及记录集
set rs = select * from table where n_ID = ParentID 找出所有该级类别。
***循环
如果有记录则判断是否有子类
set cmd = select * from talbe where n_ParentID = rs("n_ID")
如果有,则调用自己。call Menu(cmd("n_ID")
***循环结束
end function
大体就是这个意思,在必要的地方将结果输出。可我无论如果也不能做好前缀的处理工作,高手们给个算法吧。
回复列表 (共4个回复)
沙发
crazys [专家分:520] 发布于 2004-03-30 18:21:00
哈哈,我已经找高手帮我解决了。不过有没有人想知道呢?没有的话我就不麻烦发到这儿了。
板凳
圪圪 [专家分:5150] 发布于 2004-03-31 11:07:00
贴出来吧,给个精华你
3 楼
crazys [专家分:520] 发布于 2004-03-31 15:06:00
我主要是讲讲方法,如果有用的着的朋友,可以根据这个思路,自己发挥一下,相信可以做的更好。如果真是那样,别忘了贴上来,大家共享呀!
在ASP文档里先做好相应的准备工作,我用的是下拉菜单,所以在表格里我先写好相应的HTML代码:
...
<td>
<select name="TypeSelect">
<option value="0">请选择类别</option>
<% InfoTypeMenu TypeTable, "0", "" %>
</select>
</td>
...
当然也可以在过程里写好头和尾,这里我是为了让过程更通用一些,因为在后来我改动了过程,使得它可以适用于任何情况,如列表等。
Sub InfoTypeMenu(Table, ParentID, Prefix)
'参数说明:
'Table 在数据库中存放类别的表名
'ParentID 父级类别的ID号,如果从根开始生成,刚调用过程里,该参数为0
'Prefix 类别的前缀
Dim rs_Type, MainID, Brance, RecordLength, Counter, ChildPrefix
'rs_Type:类别记录集;
'MainID:主ID号,我是用数据库的自动编号,SQL里就是标识;
'Brance:分支符号,就是“└”等;
'RecordLength:记录集返回的记录数(记录长度);
'Counter:循环计数器;
'ChildPrefix:递归里向下传递的前缀。
Counter = 1 '初始化计数器
If ParentID = 0 Then Prefix = "" '如果级别为根,刚强行将前缀设置为空
Set rs_Type = Server.CreateObject("ADODB.RecordSet")
With rs_Type
.ActiveConnection = MM_DataBase_String
.Source = "SELECT * FROM " & Table & " WHERE n_ParentID = " & ParentID
.Open()
End With
'找到记录集的记录数,如果不知道,则手工计算。
RecordLength = rs_Type.RecordCount
If RecordLength = -1 Then
RecordLength = 0
While (Not rs_Type.EOF)
RecordLength = RecordLength + 1
rs_Type.MoveNext
Wend
If (rs_Type.CursorType > 0) Then
rs_Type.MoveFirst
Else
rs_Type.Requery
End If
End If
'循环生成菜单项
While (Not rs_Type.EOF)
'生成类别的前缀,这里用的方法是:根据本级的情况来生成下一级的前缀。
If ParentID = 0 Then '如果为根,则分支符和下级前缀都为空
Brance = ""
ChildPrefix = ""
elseif Counter = RecordLength then '如果是最后一条,则本级前缀为└
Brance = "└" '下级前缀前回空格
ChildPrefix = Prefix & " "
else '普通情况下,本级前缀为├
Brance = "├" '此时下级前缀为│
ChildPrefix = Prefix & "│"
End If
MainID = rs_Type.Fields.Item("n_ID").Value '找出主ID号
'输出结果,因为这里我用的是下拉菜单,所以:
Response.Write("<option value=""" & MainID & """>" & Prefix & Brance_
& rs_Type.Fields.Item("vc_FileType").Value & "</option>")
'递归调用,如果没有下一级,则空循环返回
Call InfoTypeMenu(Table, MainID, ChildPrefix)
Counter = Counter + 1 '计数器加一,用来比较是否是最后一条记录
rs_Type.MoveNext()
Wend
rs_Type.Close
Set rs_Type = Nothing
End Sub
4 楼
圪圪 [专家分:5150] 发布于 2004-04-12 09:48:00
顶起来!
我来回复