回 帖 发 新 帖 刷新版面

主题:关于类别菜单的问题。

数据库中有如下字段:
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个回复)

沙发

哈哈,我已经找高手帮我解决了。不过有没有人想知道呢?没有的话我就不麻烦发到这儿了。

板凳

贴出来吧,给个精华你

3 楼

我主要是讲讲方法,如果有用的着的朋友,可以根据这个思路,自己发挥一下,相信可以做的更好。如果真是那样,别忘了贴上来,大家共享呀!

在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 楼

顶起来!

我来回复

您尚未登录,请登录后再回复。点此登录或注册