目前该程序已在软件中使用,效果很好! 在这里公布了两个适用不同情况的两个版本
版权申明:
如果您要把它用于个人的学习与研究,本人欢迎!但如果用于商业用途,请与本人联系
[email protected]
------------------------------
<%@ Language=VBScript %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <SCRIPT LANGUAGE=javascript> <!--// --------------------------Client Code Start------------------------------- /* '''''''''''''''''''''''''''''''''''''''''''''' ''功能:树形结构的显示(树形菜单) ''说明:该程序容易理解,算法清晰,您只需使用,无需做什么修改就可以适用于各种环境 ''使用中如遇问题,请与我联系 ''Version 1.0 ''作者:陶建波 [email protected] ''2001.9.15 ''**NEW**2001.10.10陶建波 ''性能评测: '' 以本程序所提供的算法,对处理少量的数据来说,是一种简单快捷的方法,但是如果是大量的数据呢 ''比如:菘獾募锹即锏?k(千),1m(百万)会如何呢?如果是用来人口统计呢? ''假设树的平均层次为layer,记录数为n,则计算: ''文件大小:length=2000(附加的固定大小部分)+(layer*130+280+$)*n '' $的大小有layer,n与实际情况决定,但一般大于100 ''最后计算length,文件的大小可能是nk ''由此看来,该算法不适用与大的数据量的情况,请用户考虑好 ''为了改变这种不利情况,最新的算法版本请见powertree.asp,该程序将在目前功能的基础上着重考虑性能问题 ''''''''''''''''''''''''''''''''''''''''''''''' */ function showhide(objspan) { //显示,隐藏区域,达到菜单显示的目的 var temp; eval("temp=oSpan"+objspan+".style.display"); if(temp=="none") { eval("oSpan"+objspan+".style.display='block'"); eval("oImg"+objspan+".src='close.bmp'"); } else { eval("oSpan"+objspan+".style.display='none'"); eval("oImg"+objspan+".src='open.bmp'"); }
}//end function
//-----------------------------Client Code End-------------------------- //--> </SCRIPT> <style type="text/css"> <!-- a:link { font-size: 14px; text-decoration: none; color: #0000FF} a:visited { font-size: 14px; color: #0000FF; text-decoration: none} a:hover { font-size: 14px; color: #FF0000; background-color: #CCCC99; text-decoration: none} a:active { font-size: 14px; color: #FFFFFF; background-color: #191970; text-decoration: none} .item{ font-size:14px} --> </style> </HEAD> <BODY leftmargin=0 rightmargin=0> <table> <tr><td valign=top> <% '''''''''''''''''''''''''''''''Server code start'''''''''''''''''''''''''''''''
dim layer,seqer,rowcount,colcount ''全局变量定义 layer=0 '''树的层次计数器,初始化为0 seqer=0 '''顺序号计数器,初始化为0 rowcount=0 '''树组的第一维数 colcount=0 '''树组的第二维数 function listchild(id) ''参数:树的根结点ID ''可变部分: ''erect.bmp,blank.bmp,link.bmp,line.bmp,open.bmp,close.bmp 各图片的 ''说明:在本程序中作了这样的假设,你的树在数据库存储的方法为 tree{row_id,nodename,par_id,...} ''不要在未看清楚之前修改任何一条语句 ''在代码中,在editable start 与editable end 之间的未可修改内容 '' '' dim parid,i,blnchild,lastobji dim lastseqer lastobji="" '本级的最后一个对象i值,初始化为空 parid=id ' i=0 '基数0 blnchild=false '该节点是否有子节点,初始化为false lastseqer=0 '上一个节点的顺序号,初始化为0,及 while(i<rowcount) if(treedata(i,2)=parid) then lastobji=i ' if(seqer-lastseqer>1 and lastseqer<>0) then k=lastseqer+1 Response.write("<script language=javascript>") while(k<seqer ) Response.write("oerectImg"&layer&k&".src='erect.bmp';") k=k+1 wend Response.Write("</script>") end if j=0 while(j<layer) Response.Write("<img id='oerectImg"&j&seqer&"' src='blank.bmp' border=0 align='absmiddle'>") '#b01# Response.Write("<img src='blank.bmp' border=0 align='absmiddle'>") ''如果觉得垂直线之间的宽度小了,可以去掉#b01# ,#b02#两条语句的注释,同时也可以通过更改图片的大小以达目的 j=j+1 wend Response.Write("<img id='olinkImg"&parid&i&"' src='link.bmp' border=0 align='absmiddle'>") '#b02# Response.Write("<img src='line.bmp' border=0 align='absmiddle'>") Response.Write("<img id='oImg"&parid&i&"' style='cursor:hand' src='open.bmp' border=0 align='absmiddle' onclick=showhide('"&parid&i&"')>") ''''''''''''''''''''''editable start''''''''''''''''''''''''''''''''''''''' Response.write("<span class=item> </span><a href='view.asp?id="&treedata(i,0)&"' target='mainFrame' style=''>"&treedata(i,1)&"</a>") ''上面一行用户可以自行添加修改一满足实际情况。 ''''''''''''''''''''''editable end''''''''''''''''''''''''''''''''''''''' Response.Write("<br>") lastseqer=seqer '取值在先,递加在后,其中lastseqer是局部变量,其值不会与seqer同步 seqer=seqer+1 '顺序号加一 layer=layer+1 '进入递归,层次layer加一 Response.write("<span id='oSpan"&parid&i&"' style='display:none ' >") if(listchild(treedata(i,0))=false) then Response.write("<script language=javascript>oImg"&parid&i&".src='leaf.bmp';") Response.write("oImg"&parid&i&".onclick='';") 'Response.write("oImg"&parid&i&".style='cursor:nw-resize';")''改变光标类型 Response.write("</script>") end if ''''如果没有下一级,则修改前面的图标为close.bmp Response.write("</span>") blnchild=true end if i=i+1 wend if(lastobji<>"") then Response.write("<script language=javascript>olinkImg"&parid&lastobji&".src='lineleaf.bmp';</script>") end if layer=layer-1 '退出递归,层次减一 listchild=blnchild '返回是否有子节点 end function %> <% strconn="at" strsql="select * from tree" ''SQL 语句书写要求:在记录集的前嫒鲎侄伪匦胍来挝簉ow_id(惟一的主键)、name(菜单条显示的内容)、par_id(父节点row_id),其它根据需要输出与显示 set conn=server.createobject("ADODB.connection") conn.open strconn
set rs=server.createobject("ADODB.Recordset") rs.open strsql,conn,3,3 rs.MoveFirst %> <% rowcount=rs.RecordCount colcount=3 '这个值根据实际情况设定 dim treedata,i,j redim treedata(rowcount,colcount) rs.MoveFirst i=0 while(not rs.EOF) j=0 while(j<colcount) treedata(i,j)=rs.Fields(j).Value j=j+1 wend rs.MoveNext i=i+1 wend rs.Close set rs=nothing
'''''''初始化完毕数组
Response.write("<span id='treeroot' style='display:block' border=0>") Response.Write("<bold>树形菜单演示程序</bold><br>") listchild("root") Response.write("</span>") '''''''''''''''''''''''''''''''''''''''''Server Code END '''''''''''''''''''''''''''''''''' %></td> </tr></table> </BODY> </HTML>

|