[精] [原创] ASP递归无极限菜单树
[attach]3856[/attach]<br><br><DIV class=quote><%<br>'**************************************************************<br>'**************************************************************<br>'**版本:Toumh无极限菜单树 **<br>'**编号:TOUMH-20051124 **<br>'**作者:阳光白雪 **<br>'**主页:<a href="http://www.ec2002.com/" target="_blank" >http://www.ec2002.com</A> **<br>'**邮件:<a href="mailto:chenmanyi0818@126.com" target="_blank" >chenmanyi0818@126.com</A> **<br>'**声明:转载或使用时请保留程序的完整性,请保留以上信息。 **<br>'** 禁止用于任何商业用途! **<br>'**************************************************************<br>'**************************************************************<br>dataurl=Server.MapPath("menutree.mdb")'数据库地址<br>dim conn,strQuery,rs<br>set conn = server.CreateObject("adodb.connection")<br>conn.Open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE="&dataurl<br>strQuery="select * from menufun"<br>set rs=server.createobject("adodb.recordset")<br>rs.open strQuery,conn,1,1<br>allnum=rs.RecordCount<br>'取得最大的层数MaxLevel<br>MaxLevel=1 <br>for i=1 to allnum<br>if rs("PartLevel")>MaxLevel then<br> MaxLevel=rs("PartLevel")<br>else<br> MaxLevel=MaxLevel<br>end if<br>rs.movenext<br>next<br>rs.close<br>set rs=nothing<br>%><br><html><br><head><br><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br><title>Toumh无极限菜单树</title><br><style type="text/css"><br><!--<br>td {<br>font-size: 12px;<br>}<br>--><br></style><br><script language="javascript"><br><!--<br>function divshow(cmy1,cmy2,cmy3)<br>//展开/合并菜单函数<br>{<br> if(document.all("div"+cmy1+cmy2+cmy3).style.display==""){<br> document.all("div"+cmy1+cmy2+cmy3).style.display="none"<br> }else{<br> document.all("div"+cmy1+cmy2+cmy3).style.display=""<br> }<br>}<br>//--><br></script><br></head><br><body bgcolor="#6699CC" topmargin="0"><br><table border="0" cellpadding="0" cellspacing="0"><br><tr onClick="javascript:divshow(1,0,1);" style="cursor:hand"><TD><img src="images/admin.gif">Toumh无极限菜单树</TD></tr><br><%<br>dim toumh(10) '定义用于存放菜单前显示树图片的数组,如果应用时的最大级数大于十,请扩大数组维数<br>call menutree(1,0,MaxLevel,1)'首次调用菜单输出函数<br>'第一个参数:菜单的级数<br>'第二个参数:父菜单的ID,一级菜单默认为零<br>'第三个参数:菜单的最大级数<br>'第四个参数:用于区分层的名称,方便实现菜单的展开合并<br>%><br></table><br><%<br>'funno 菜单的级数<br>'funcid 父菜单的ID,一级菜单父级ID值为0<br>'MaxLevel 菜单的最大级数<br>'divno 用于区分层的名称,方便实现菜单的展开合并<br>'menutree() 数形菜单输出函数<br>function menutree(funno,funcid,MaxLevel,divno)<br> dim rsfun,numfun,funcidfun<br> strQuery1="select * from menufun where sup_funcid='"&funcid&"'"<br> set rsfun=server.createobject("adodb.recordset")<br> rsfun.open strQuery1,conn,1,1<br> numfun=rsfun.RecordCount<br> response.Write("<tr><td>")<br> response.Write("<div id='div"&funno&funcid&divno&"' style='display:none'>")'输出层,并根据相关参数给层定义唯一的ID名称<br> response.Write("<table border='0' cellpadding='0' cellspacing='0'>")<br> for j=1 to numfun<br> funcidfun=rsfun("funcid")<br> if j=numfun then '判断是否是本级菜单的最后一个<br> toumh(funno)="space.gif" '是则输出空白图片space.gif<br> else<br> toumh(funno)="line_v.gif" '否则输出竖线图片line_v.gif<br> end if<br>'判断是否有下级菜单<br> strQuery2="select * from menufun where sup_funcid='"&funcidfun&"'"<br> set rsfun2=server.createobject("adodb.recordset")<br> rsfun2.open strQuery2,conn,1,1<br> numfun2=rsfun2.RecordCount<br>'如果numfun2>0则有,反之则无<br> if numfun2 > 0 then<br> response.Write("<tr onClick='javascript:divshow("&funno+1&","&funcidfun&","&j&");' style='cursor:hand'>") <br> '用单击事件调用展开/合并菜单函数<br> else<br> response.Write("<tr style='cursor:hand'>")<br> end if<br> response.Write("<td>")<br> if numfun2 > 0 then<br> treeico="open_normal.gif"<br> if j=numfun then<br> treeico="open_end.gif"<br> end if <br> else<br> treeico="none_normal.gif"<br> if j=numfun then<br> treeico="none_end.gif"<br> end if <br> end if<br>for m=1 to cint(funno)-1 '根据当前菜单的级数输出菜单前的数形图片<br> response.Write("<img src='images/"&toumh(m)&"' align='absMiddle'>")<br> next<br>if not rsfun("enable") then '判断菜单项是否可用,不可用的菜单名用#FF0000色显示<br> response.Write("<img src='images/"&treeico&"' align='absMiddle'><font color='#ff0000'>"&rsfun("funcname")&"</font>")'输出不可用菜单名<br>else<br> response.Write("<img src='images/"&treeico&"' align='absMiddle'>"&rsfun("funcname"))'输出可用菜单名<br>end if<br> response.Write("</td>")<br> response.Write("</tr>")<br>if cint(funno)<cint(MaxLevel) then<br> call menutree(cint(funno)+1,funcidfun,MaxLevel,j) '递归调用 menutree()函数<br> end if<br>rsfun.movenext <br> next<br> 'response.Write("</td></tr>")<br> response.Write("</table></div>")<br> response.Write("</td></tr>")<br>end function<br>%><br><!-- 程序中未能改变菜单展开/合并时的图片的属性,有兴趣的网友可以自己添加该功能 --><br></body><br></html><FONT style="BACKGROUND-COLOR: #f3f3f3"></DIV>
<DIV class=quote><FONT color=#ff0000><STRONG>数据库字段说明:<br></STRONG></FONT><FONT style="BACKGROUND-COLOR: #f3f3f3"><br>字段名称 数据类型 字段说明<br>--------------------------------------------------<br></FONT><FONT style="BACKGROUND-COLOR: #f3f3f3">funcid 自动编号 菜单id<br>funcname 文本 菜单名<br>link_url 文本 连接地址<br>PartLevel 文本 分级编号(级别)<br>sup_funcid 数字 父菜单ID(一级菜单为0)<br>fun_no 数字 菜单排序<br>enable 是/否 是否可用</FONT>
<P><FONT style="BACKGROUND-COLOR: #f3f3f3">(在下载数据库中带有注释。)<br></FONT></P></DIV></FONT>
[align=right][color=#000066][此贴子已经被作者于2007-3-9 14:53:13编辑过][/color][/align]
<P>一夜的心血啊,不要沉了,顶一下~~~~~~~~~<br><br>前两天都在要这东西,怎么现在也没人看了~~~<br><br>我顶!我顶顶!!我顶顶顶!!!……</P>[em11][em11]
[align=right][color=#000066][此贴子已经被作者于2005-11-24 17:04:10编辑过][/color][/align]
这里的人大部分是根据自己需要来看<BR><BR>等以后有人需要的时候又该问了 太好了,我正想找的!! 强帖<BR>收藏 dataurl=Server.MapPath("menutree.mdb")'数据库地址<BR>这样使用对数据库安全吗? <P>你可以改的,这里只是一个范例!</P> 我很讨厌 document.all '取得最大的层数MaxLevel<BR>MaxLevel=1 <BR>for i=1 to allnum<BR>if rs("PartLevel")>MaxLevel then<BR> MaxLevel=rs("PartLevel")<BR>else<BR> MaxLevel=MaxLevel<BR>end if<BR>rs.movenext<BR>next<BR>rs.close<BR>set rs=nothing<BR><BR>我宁愿用SQL语句直接取得MaxLevel也不会用这种循环所有记录比较的方法来取。 我也不喜欢,以前我从不用的,不过没有办法,因为表单名称中带有参数,我试过用/document.表单名.表单元素名,可是没法实现,只能这样了! document.getElementById <DIV class=quote><B>以下是引用<U>griefforyou</U>在2005-11-28 9:00:00的发言:</B><BR>'取得最大的层数MaxLevel<BR>MaxLevel=1 <BR>for i=1 to allnum<BR>if rs("PartLevel")>MaxLevel then<BR> MaxLevel=rs("PartLevel")<BR>else<BR> MaxLevel=MaxLevel<BR>end if<BR>rs.movenext<BR>next<BR>rs.close<BR>set rs=nothing<BR><BR>我宁愿用SQL语句直接取得MaxLevel也不会用这种循环所有记录比较的方法来取。</DIV>
<P>是哦,很浪费资源,好象是MAX(),可是我不会用,请指点啊!<BR></P> 果然是好贴收了.好好研究一下.<BR> SQL的方式应该怎么修改!!<BR><BR>做的非常好啊!! <P>强贴做死的顶</P> 强,收单啦.[em01] <P><BR>我共享一个(转载的)<BR>演示:<a href="http://www.115000.com.cn/liuy/txttree/dir.asp" target="_blank" >http://www.115000.com.cn/liuy/txttree/dir.asp</A><BR>下载:<a href="http://www.115000.com.cn/liuy/txttree/txttree.rar" target="_blank" >http://www.115000.com.cn/liuy/txttree/txttree.rar</A></P> <P>谢谢老兄了。我正需要这东西的,我实在是太感谢了。</P>
有点不明白的地方
<P>能大概说下数据库是怎么设计的么? 每个字段的作用</P> 先顶下,虽然我不知道什么是菜单树页:
[1]
2
