编程论坛's Archiver

阳光白雪 发表于 2005-11-24 14:54

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

[attach]3856[/attach]<br><br>
<DIV class=quote>&lt;%<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="&amp;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")&gt;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>%&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;title&gt;Toumh无极限菜单树&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>&lt;!--<br>td {<br>font-size: 12px;<br>}<br>--&gt;<br>&lt;/style&gt;<br>&lt;script language="javascript"&gt;<br>&lt;!--<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>//--&gt;<br>&lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body bgcolor="#6699CC" topmargin="0"&gt;<br>&lt;table border="0" cellpadding="0" cellspacing="0"&gt;<br>&lt;tr onClick="javascript:divshow(1,0,1);" style="cursor:hand"&gt;&lt;TD&gt;&lt;img src="images/admin.gif"&gt;Toumh无极限菜单树&lt;/TD&gt;&lt;/tr&gt;<br>&lt;%<br>dim toumh(10) '定义用于存放菜单前显示树图片的数组,如果应用时的最大级数大于十,请扩大数组维数<br>call menutree(1,0,MaxLevel,1)'首次调用菜单输出函数<br>'第一个参数:菜单的级数<br>'第二个参数:父菜单的ID,一级菜单默认为零<br>'第三个参数:菜单的最大级数<br>'第四个参数:用于区分层的名称,方便实现菜单的展开合并<br>%&gt;<br>&lt;/table&gt;<br>&lt;%<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='"&amp;funcid&amp;"'"<br>  set rsfun=server.createobject("adodb.recordset")<br>  rsfun.open strQuery1,conn,1,1<br>  numfun=rsfun.RecordCount<br>  response.Write("&lt;tr&gt;&lt;td&gt;")<br>  response.Write("&lt;div id='div"&amp;funno&amp;funcid&amp;divno&amp;"' style='display:none'&gt;")'输出层,并根据相关参数给层定义唯一的ID名称<br>  response.Write("&lt;table border='0' cellpadding='0' cellspacing='0'&gt;")<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='"&amp;funcidfun&amp;"'"<br>    set rsfun2=server.createobject("adodb.recordset")<br>    rsfun2.open strQuery2,conn,1,1<br>    numfun2=rsfun2.RecordCount<br>'如果numfun2&gt;0则有,反之则无<br>    if numfun2 &gt; 0 then<br>   response.Write("&lt;tr onClick='javascript:divshow("&amp;funno+1&amp;","&amp;funcidfun&amp;","&amp;j&amp;");' style='cursor:hand'&gt;") <br>          '用单击事件调用展开/合并菜单函数<br>    else<br>   response.Write("&lt;tr style='cursor:hand'&gt;")<br>    end if<br>    response.Write("&lt;td&gt;")<br>    if numfun2 &gt; 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("&lt;img src='images/"&amp;toumh(m)&amp;"' align='absMiddle'&gt;")<br>    next<br>if not rsfun("enable") then    '判断菜单项是否可用,不可用的菜单名用#FF0000色显示<br>    response.Write("&lt;img src='images/"&amp;treeico&amp;"' align='absMiddle'&gt;&lt;font color='#ff0000'&gt;"&amp;rsfun("funcname")&amp;"&lt;/font&gt;")'输出不可用菜单名<br>else<br>    response.Write("&lt;img src='images/"&amp;treeico&amp;"' align='absMiddle'&gt;"&amp;rsfun("funcname"))'输出可用菜单名<br>end if<br>    response.Write("&lt;/td&gt;")<br>    response.Write("&lt;/tr&gt;")<br>if cint(funno)&lt;cint(MaxLevel) then<br>   call menutree(cint(funno)+1,funcidfun,MaxLevel,j)  '递归调用 menutree()函数<br>    end if<br>rsfun.movenext <br>  next<br>  'response.Write("&lt;/td&gt;&lt;/tr&gt;")<br>  response.Write("&lt;/table&gt;&lt;/div&gt;")<br>  response.Write("&lt;/td&gt;&lt;/tr&gt;")<br>end function<br>%&gt;<br>&lt;!-- 程序中未能改变菜单展开/合并时的图片的属性,有兴趣的网友可以自己添加该功能 --&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<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]

阳光白雪 发表于 2005-11-24 15:47

<P>一夜的心血啊,不要沉了,顶一下~~~~~~~~~<br><br>前两天都在要这东西,怎么现在也没人看了~~~<br><br>我顶!我顶顶!!我顶顶顶!!!……</P>[em11][em11]
[align=right][color=#000066][此贴子已经被作者于2005-11-24 17:04:10编辑过][/color][/align]

islet 发表于 2005-11-24 15:54

这里的人大部分是根据自己需要来看<BR><BR>等以后有人需要的时候又该问了

caiyakang 发表于 2005-11-27 23:52

太好了,我正想找的!!

静夜思 发表于 2005-11-28 00:04

强帖<BR>收藏

超级之菜鸟 发表于 2005-11-28 02:31

dataurl=Server.MapPath("menutree.mdb")'数据库地址<BR>这样使用对数据库安全吗?

阳光白雪 发表于 2005-11-28 08:55

<P>你可以改的,这里只是一个范例!</P>

griefforyou 发表于 2005-11-28 08:58

我很讨厌 document.all

griefforyou 发表于 2005-11-28 09:00

'取得最大的层数MaxLevel<BR>MaxLevel=1    <BR>for i=1 to allnum<BR>if rs("PartLevel")&gt;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也不会用这种循环所有记录比较的方法来取。

阳光白雪 发表于 2005-11-28 09:01

我也不喜欢,以前我从不用的,不过没有办法,因为表单名称中带有参数,我试过用/document.表单名.表单元素名,可是没法实现,只能这样了!

griefforyou 发表于 2005-11-28 09:47

document.getElementById

阳光白雪 发表于 2005-11-28 09:53

<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")&gt;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>

suyongtao 发表于 2005-11-28 10:41

果然是好贴收了.好好研究一下.<BR>

a123 发表于 2006-4-15 15:27

SQL的方式应该怎么修改!!<BR><BR>做的非常好啊!!

danhaoran 发表于 2006-4-15 16:53

<P>强贴做死的顶</P>

water123456 发表于 2006-4-15 20:09

强,收单啦.[em01]

adleyliu 发表于 2006-4-15 20:49

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

ludong248 发表于 2006-7-15 15:41

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

guyer 发表于 2007-3-9 14:38

有点不明白的地方

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

dh2007 发表于 2007-3-9 14:44

先顶下,虽然我不知道什么是菜单树

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.