注册 登录
编程论坛 ASP技术论坛

[精] [原创] ASP递归无极限菜单树

阳光白雪 发布于 2005-11-24 14:54, 11192 次点击
只有本站会员才能查看附件,请 登录


<%
'**************************************************************
'**************************************************************
'**版本:Toumh无极限菜单树 **
'**编号:TOUMH-20051124 **
'**作者:阳光白雪 **
'**主页:http://www.ec2002.com **
'**邮件:chenmanyi0818@126.com **
'**声明:转载或使用时请保留程序的完整性,请保留以上信息。 **
'** 禁止用于任何商业用途! **
'**************************************************************
'**************************************************************
dataurl=Server.MapPath("menutree.mdb")'数据库地址
dim conn,strQuery,rs
set conn = server.CreateObject("adodb.connection")
conn.Open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="&dataurl
strQuery="select * from menufun"
set rs=server.createobject("adodb.recordset")
rs.open strQuery,conn,1,1
allnum=rs.RecordCount
'取得最大的层数MaxLevel
MaxLevel=1
for i=1 to allnum
if rs("PartLevel")>MaxLevel then
MaxLevel=rs("PartLevel")
else
MaxLevel=MaxLevel
end if
rs.movenext
next
rs.close
set rs=nothing
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Toumh无极限菜单树</title>
<style type="text/css">
<!--
td {
font-size: 12px;
}
-->
</style>
<script language="javascript">
<!--
function divshow(cmy1,cmy2,cmy3)
//展开/合并菜单函数
{
if(document.all("div"+cmy1+cmy2+cmy3).style.display==""){
document.all("div"+cmy1+cmy2+cmy3).style.display="none"
}else{
document.all("div"+cmy1+cmy2+cmy3).style.display=""
}
}
//-->
</script>
</head>
<body bgcolor="#6699CC" topmargin="0">
<table border="0" cellpadding="0" cellspacing="0">
<tr onClick="javascript:divshow(1,0,1);" style="cursor:hand"><TD><img src="images/admin.gif">Toumh无极限菜单树</TD></tr>
<%
dim toumh(10) '定义用于存放菜单前显示树图片的数组,如果应用时的最大级数大于十,请扩大数组维数
call menutree(1,0,MaxLevel,1)'首次调用菜单输出函数
'第一个参数:菜单的级数
'第二个参数:父菜单的ID,一级菜单默认为零
'第三个参数:菜单的最大级数
'第四个参数:用于区分层的名称,方便实现菜单的展开合并
%>
</table>
<%
'funno 菜单的级数
'funcid 父菜单的ID,一级菜单父级ID值为0
'MaxLevel 菜单的最大级数
'divno 用于区分层的名称,方便实现菜单的展开合并
'menutree() 数形菜单输出函数
function menutree(funno,funcid,MaxLevel,divno)
dim rsfun,numfun,funcidfun
strQuery1="select * from menufun where sup_funcid='"&funcid&"'"
set rsfun=server.createobject("adodb.recordset")
rsfun.open strQuery1,conn,1,1
numfun=rsfun.RecordCount
response.Write("<tr><td>")
response.Write("<div id='div"&funno&funcid&divno&"' style='display:none'>")'输出层,并根据相关参数给层定义唯一的ID名称
response.Write("<table border='0' cellpadding='0' cellspacing='0'>")
for j=1 to numfun
funcidfun=rsfun("funcid")
if j=numfun then '判断是否是本级菜单的最后一个
toumh(funno)="space.gif" '是则输出空白图片space.gif
else
toumh(funno)="line_v.gif" '否则输出竖线图片line_v.gif
end if
'判断是否有下级菜单
strQuery2="select * from menufun where sup_funcid='"&funcidfun&"'"
set rsfun2=server.createobject("adodb.recordset")
rsfun2.open strQuery2,conn,1,1
numfun2=rsfun2.RecordCount
'如果numfun2>0则有,反之则无
if numfun2 > 0 then
response.Write("<tr onClick='javascript:divshow("&funno+1&","&funcidfun&","&j&");' style='cursor:hand'>")
'用单击事件调用展开/合并菜单函数
else
response.Write("<tr style='cursor:hand'>")
end if
response.Write("<td>")
if numfun2 > 0 then
treeico="open_normal.gif"
if j=numfun then
treeico="open_end.gif"
end if
else
treeico="none_normal.gif"
if j=numfun then
treeico="none_end.gif"
end if
end if
for m=1 to cint(funno)-1 '根据当前菜单的级数输出菜单前的数形图片
response.Write("<img src='images/"&toumh(m)&"' align='absMiddle'>")
next
if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"&rsfun("funcname")&"</font>")'输出不可用菜单名
else
response.Write("<img src='images/"&treeico&"' align='absMiddle'>"&rsfun("funcname"))'输出可用菜单名
end if
response.Write("</td>")
response.Write("</tr>")
if cint(funno)<cint(MaxLevel) then
call menutree(cint(funno)+1,funcidfun,MaxLevel,j) '递归调用 menutree()函数
end if
rsfun.movenext
next
'response.Write("</td></tr>")
response.Write("</table></div>")
response.Write("</td></tr>")
end function
%>
<!-- 程序中未能改变菜单展开/合并时的图片的属性,有兴趣的网友可以自己添加该功能 -->
</body>
</html>
数据库字段说明:

字段名称 数据类型 字段说明
--------------------------------------------------
funcid 自动编号 菜单id
funcname 文本 菜单名
link_url 文本 连接地址
PartLevel 文本 分级编号(级别)
sup_funcid 数字 父菜单ID(一级菜单为0)
fun_no 数字 菜单排序
enable 是/否 是否可用

(在下载数据库中带有注释。)

[此贴子已经被作者于2007-3-9 14:53:13编辑过]

49 回复
#2
阳光白雪2005-11-24 15:47

一夜的心血啊,不要沉了,顶一下~~~~~~~~~

前两天都在要这东西,怎么现在也没人看了~~~

我顶!我顶顶!!我顶顶顶!!!……

[此贴子已经被作者于2005-11-24 17:04:10编辑过]

#3
islet2005-11-24 15:54
这里的人大部分是根据自己需要来看

等以后有人需要的时候又该问了
#4
caiyakang2005-11-27 23:52
太好了,我正想找的!!
#5
静夜思2005-11-28 00:04
强帖
收藏
#6
超级之菜鸟2005-11-28 02:31
dataurl=Server.MapPath("menutree.mdb")'数据库地址
这样使用对数据库安全吗?
#7
阳光白雪2005-11-28 08:55

你可以改的,这里只是一个范例!

#8
griefforyou2005-11-28 08:58
我很讨厌 document.all
#9
griefforyou2005-11-28 09:00
'取得最大的层数MaxLevel
MaxLevel=1
for i=1 to allnum
if rs("PartLevel")>MaxLevel then
MaxLevel=rs("PartLevel")
else
MaxLevel=MaxLevel
end if
rs.movenext
next
rs.close
set rs=nothing

我宁愿用SQL语句直接取得MaxLevel也不会用这种循环所有记录比较的方法来取。
#10
阳光白雪2005-11-28 09:01
我也不喜欢,以前我从不用的,不过没有办法,因为表单名称中带有参数,我试过用/document.表单名.表单元素名,可是没法实现,只能这样了!
#11
griefforyou2005-11-28 09:47
document.getElementById
#12
阳光白雪2005-11-28 09:53
以下是引用griefforyou在2005-11-28 9:00:00的发言:
'取得最大的层数MaxLevel
MaxLevel=1
for i=1 to allnum
if rs("PartLevel")>MaxLevel then
MaxLevel=rs("PartLevel")
else
MaxLevel=MaxLevel
end if
rs.movenext
next
rs.close
set rs=nothing

我宁愿用SQL语句直接取得MaxLevel也不会用这种循环所有记录比较的方法来取。

是哦,很浪费资源,好象是MAX(),可是我不会用,请指点啊!

#13
suyongtao2005-11-28 10:41
果然是好贴收了.好好研究一下.
#14
a1232006-04-15 15:27
SQL的方式应该怎么修改!!

做的非常好啊!!
#15
danhaoran2006-04-15 16:53

强贴做死的顶

#16
water1234562006-04-15 20:09
强,收单啦.
#17
adleyliu2006-04-15 20:49
#18
ludong2482006-07-15 15:41

谢谢老兄了。我正需要这东西的,我实在是太感谢了。

#19
guyer2007-03-09 14:38
有点不明白的地方

能大概说下数据库是怎么设计的么? 每个字段的作用

#20
dh20072007-03-09 14:44
先顶下,虽然我不知道什么是菜单树
#21
lq73506842007-03-09 14:45
收下了。
#22
阳光白雪2007-03-09 14:50
以下是引用guyer在2007-3-9 14:38:00的发言:

能大概说下数据库是怎么设计的么? 每个字段的作用

字段名称 数据类型 字段说明

funcid 自动编号 菜单id
funcname 文本 菜单名
link_url 文本 连接地址
PartLevel 文本 分级编号(级别)
sup_funcid 数字 父菜单ID(一级菜单为0)
fun_no 数字 菜单排序
enable 是/否 是否可用

(在下载数据库中都带有注释。)
#23
guyer2007-03-09 15:14

做的基本上可以实现了 谢谢你啊!

#24
atian2007-03-10 10:03

不错,强。可是发现link_url这个字段没有用到,不知放在哪里可以实现超级链接。哪位能否再修一下。让它实现超链接。

funcid 自动编号 菜单id
funcname 文本 菜单名
link_url 文本 连接地址
PartLevel 文本 分级编号(级别)
sup_funcid 数字 父菜单ID(一级菜单为0)
fun_no 数字 菜单排序
enable 是/否 是否可用

#25
atian2007-03-12 12:47
版主。怎么实现超链接。

#26
阳光白雪2007-03-12 13:00
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'><a href='"& Rs("link_url") &"'>"&rsfun("funcname")&"</a></font>")'输出不可用菜单名
#27
hangxj2007-03-12 15:29
顶你,爱死了,好程序,收藏先
#28
atian2007-03-12 16:02
谢谢。
#29
lyli2007-03-12 16:09
好样的,我顶!!这样要做树目录就不用怕了!谢了
#30
atian2007-03-12 16:56

我改了一下。还是实现不了超链接。请大家再帮忙改改。

if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"&rsfun("funcname")&"</font>")
'输出不可用菜单名
else
response.Write("<img src='images/"&treeico&"' align='absMiddle'><a href='"& Rsfun("link_url") &"'>"&rsfun("funcname")&"</a>")

'输出可用菜单名
end if

#31
atian2007-03-14 22:01
版主,你还没有解决这个问题呀。

怎样用上那个链接字段。
#32
阳光白雪2007-03-15 08:30
if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"& rsfun("funcname") &"</font>")'输出不可用菜单名,无链接
else
response.Write("<img src='images/"&treeico&"' align='absMiddle'><A href="""& rsfun("link_url") &""" target=""_blank"">"& rsfun("funcname") &"</a>") '输出可用菜单名和链接
end if
#33
xinglin20052007-03-15 10:36
收藏了
#34
atian2007-03-16 11:22
以下是引用阳光白雪在2007-3-15 8:30:00的发言:
if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"& rsfun("funcname") &"</font>")'输出不可用菜单名,无链接
else
response.Write("<img src='images/"&treeico&"' align='absMiddle'><A href="""& rsfun("link_url") &""" target=""_blank"">"& rsfun("funcname") &"</a>") '输出可用菜单名和链接
end if

虽然可以连接,但是子菜单名也会有超链接。如何做到子菜单名不可链接。但超链接最底层的菜单。

#35
阳光白雪2007-03-16 13:23
[QUOTE] if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示
response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"& rsfun("funcname") &"</font>")'输出不可用菜单名
Else
If numfun2 > 0 Then ''如果有子菜单则不添加连接
response.Write("<img src='images/"&treeico&"' align='absMiddle'>"& rsfun("funcname"))'输出可用菜单名
Else
response.Write("<img src='images/"&treeico&"' align='absMiddle'><A href="""& rsfun("link_url") &""" target=""_blank"">"& rsfun("funcname") &"</a>")'输出可用菜单名
End If
end if[/QUOTE]
#36
發呆的小猪2008-02-01 22:28
我想问一下,在递归的过程中是否可以更新数据库呢?
#37
lujiale2008-07-21 12:57
好了,我正想找的
#38
kgdipbyve2008-07-22 08:30
顶起来
#39
haohao_1682008-10-28 15:17
我怎么看不到呢
我怎么看不到呢
#40
woxiang04182008-10-29 18:32

谢谢拉
#41
xiangchun32008-10-29 20:49
好东西 ,先留下,以后有用!
#42
七七四十九2008-10-29 23:33
虽然现在看不懂,收藏先,这是我逛论坛最喜欢做的事,今后有用慢慢学
#43
yell62008-11-09 10:11
强人,支持!
#44
pylbx2009-07-18 12:15
喜欢!
#45
leaf07172009-08-20 08:22
谢谢了。
#46
mgmt_asp2009-09-04 20:52
支持
#47
lengchuan2009-09-06 16:59
虽然暂时我用不上,但还是顶起来!
#48
xinyi_20092010-06-12 13:40
现在看来,真的很好!
#49
lwcompany2011-01-22 11:50
太好了,收藏
#50
dahui2011-03-08 14:17
数据可中链接地址怎么填写啊
1