无限级分类

表名:MenuTree
字段
M_ID   自增
M_Name  文本
Childid   目前只是文本,长度250,也可设为备注,存储子类ID,多个ID以逗号分隔
Depth   类别深度,用于控制类别层次,也可以据此生成数组
=======================================
文件名:Conn.asp
=======================================
<%
    On Error Resume Next 
 Dim Conn
 Set Conn = Server.CreateObject("ADODB.Connection")
 Conn.connectionstring="Provider=Microsoft.JET.OLEDB.4.0;Data Source="&Server.MapPath("MenuTree.mdb")&""
 Conn.open()
 IF Err then
 Err.Clear
 Set Conn=nothing
 Response.Write "数据库链接失败"
 Response.End()
 End IF
 
 Function Closeconn()
  IF isobject(Conn) then
  Conn.close:Set Conn=nothing
  End IF
 End Function
%>
========================================
文件名:MenuTree.asp
目前实现到显示,添加
========================================
<!--#include file="Conn.asp"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="ASP无限级分类" />
<meta name="description" content="ASP无限级分类,2006-9-18" />
<meta name="Author" content="江生华">
<title>ASP无限级分类</title>
<style>
<!--
body{font-size:12px;color:#333333;line-height:20px;}
A{font-size:12px;color:#333333;text-decoration:underline;}
A:hover{font-size:12px;color:FF6600;text-decoration:underline}
#MenuList{border:1px solid #CCCCCC;background-color:#FFFFFF;margin:auto;Padding:0px;width:700px;height:30px;line-height:30px;}
#Menu{border:1px solid #EEEEEE;background-color:#F5F5F5;margin:auto;Padding:0px;width:60px;}
#Form{border:1px solid #CCCCCC;background-color:#F5F5F5;margin:auto;Padding-top:5px;Padding-bottom:5px;width:700px;height:20px;line-height:25px; text-align:center;}
input{border:1px solid #CCCCCC;background-color:#EEEEEE;}
#UL{margin:auto;padding:0px;width:100%;height:25px;line-height:25px;}
#LI{ list-style-type:none;}
#L_LI{margin:auto;height:25px;line-height:25px;width:82%;clear:right;float:left;text-align:left;}
#R_LI{margin:auto;height:25px;line-height:25px;width:18%;clear:right;float:left;text-align:right;}
-->
</style>
<script>
function check(){
 if(document.form.catename.value.length<1)
 {
 alert("乖,填了父类名称我就让你提交!!");
 document.form.catename.focus();
 return false
 }
}
</script>
</head>
<body>
<%
 Dim Starttime,Endtime
 Starttime=timer()
 Sub Children(str)
 IF Isnull(str) Then Exit Sub
  Dim Crs,Csql
  Set Crs=Server.CreateObject("ADODB.Recordset")
  Csql="Select * From MenuTree where M_ID in ("&str&")"   '使用in的话字段Childid的值必须是以逗号作分割符,否则需split
  Crs.open Csql,conn,1
  IF Not Crs.Eof Then
  Dim MenuList:MenuList=Crs.Getrows()
  Crs.Close:Set Crs=Nothing
  End IF
  For i=0 to Ubound(MenuList,2)
      Response.Write "<UL ID='UL' OnMouseOut=""this.style.backgroundColor=''"" OnMouseOver=""this.style.backgroundColor='#EEEEEE';"">"
   Response.Write "<LI ID='L_LI'>"
   For j=0 to MenuList(3,i)       '通过深度来调整缩进距离,以求层次分明而且美观
   Response.Write "&nbsp;&nbsp;&nbsp;"
   Next
   Response.Write "|---"&MenuList(1,i)&"</LI>"
   Response.Write "<LI ID='R_LI'><a href='?Action=Add&Parentid="&MenuList(0,i)&"'>添加</a> <a href='Modi.asp?Parentid="&MenuList(0,i)&"'>修改</a> <a href='Del.asp?Parentid="&MenuList(0,i)&"' οnclick=""return confirm('你确定要删除吗?');"">删除</a>&nbsp;</LI>"
   Response.Write "</UL>"
   IF Not Isnull(MenuList(2,i)) then
   Call Children(MenuList(2,i))
   End IF
  Next
 End Sub
 
 IF Request("Action")="Save" Then
     Dim Menuname:Menuname=Trim(Request.Form("catename"))
  Dim Parentid:Parentid=Request.QueryString("Parentid")
  IF Menuname="" Then
  Response.Write "<script>alert('您没有填写类别名称');history.go(-1)</script>"
  Response.End()
  Else
  Menuname=Replace(Menuname,"'","")
  End IF
  IF Parentid="" Then
  Conn.Execute("Insert into MenuTree(M_Name) values ('"&Menuname&"')")
  Else
   IF Not Isnumeric(Parentid) Then
   Response.Write ("<script>alert('父类ID不是数字');history.go(-1)</script>")
   Response.End()
   Else
   Dim MaxDepth,MaxID
   MaxDepth=Conn.Execute("Select Depth From MenuTree where M_ID="&Parentid&"")(0)+1   '取深度
   Conn.Execute("Insert into MenuTree(M_Name,Depth) values ('"&Menuname&"',"&MaxDepth&")")  
   Dim Ssql:Ssql="Select Max(M_ID) as a From MenuTree"
   Dim Srs
   Set Srs=Conn.Execute(Ssql)
   MaxID=Srs("a")               '取得当前最大M_ID
   Srs.close:Set Srs=Nothing
   Dim Msql,Mrs
   Msql="Select * From MenuTree where M_ID="&Parentid&""
   Set Mrs=Server.CreateObject("ADODB.Recordset")
   Mrs.open Msql,Conn,1,3
    IF Isnull(Mrs("Childid")) Then         '录入子类M_ID
    Mrs("Childid")=MaxID
    Else
    Mrs("Childid")=Mrs("Childid")&","&MaxID
    End IF
   Mrs.update
   End IF 
  End IF
  Response.Redirect "MenuTree.asp"
 End IF
%>
   <DIV ID="Form"><a href="?Action=Add" _fcksavedurl=""?Action=Add"" style="font-weight:bold;color:#FF6600">我要添加父类</a></DIV>
   <BR/>
   <DIV id="MenuList">
<%
 '=================================================
 '******************开始显示类别*******************
 '=================================================
 Dim Rs
 Set Rs=Server.CreateObject("ADODB.Recordset")
 Rs.open "Select * From MenuTree where Depth=0",Conn,1
 IF Rs.Eof Then
 Response.Write "<span style='color:#FF6600;font-weight:bold;'>·暂时还没有任何分类,我要<a href='?Action=Add'>添加</a></span>"
 Else
 Do While Not Rs.Eof
 Response.Write "<UL ID='UL' OnMouseOut=""this.style.backgroundColor=''"" OnMouseOver=""this.style.backgroundColor='#EEEEEE';"">"
 Response.Write "<LI ID='L_LI'>"
 Response.Write "|--"&Rs(1)&""
 Response.Write "</LI><LI ID='R_LI'><a href='?Action=Add&Parentid="&Rs(0)&"'>添加</a> <a href='Modi.asp?Parentid="&Rs(0)&"'>修改</a> <a href='Del.asp?Parentid="&Rs(0)&"' οnclick=""return confirm('你确定要删除吗?');"">删除</a>&nbsp;</LI></UL>"
  IF Not Isnull(Rs(2)) Then
  Call Children(Rs(2))
  End IF
 Rs.Movenext()
 Loop
 End IF
 Rs.Close:Set Rs=Nothing
 Closeconn
 '=================================================
 '******************结束显示类别*******************
 '=================================================
%>
</DIV>
    <BR/>
<%
IF Request("Action")="Add" Then
%>
    <DIV id="Form">
 <Form name="form" action="?Action=Save&Parentid=<%=Request("Parentid")%>" method="post" οnsubmit="return check()" style="margin:0px;">
 请填写父类名称:<input type="text" name="catename" size="30">   <input type="submit" value="提 交" name="submit">
 </Form>
 </DIV>
<%
End IF
Endtime=timer()
%>
<DIV align="center">本页耗时<%=Formatnumber((Endtime-Starttime)*1000,2)%>MS</DIV>
</body>
</html>
=================================================

文件名:Modi.asp,修改,可以任意调整类别的位置
=================================================
<!--#include file="Conn.asp"-->
<%
'=============保存修改
IF Request("Action")="Save" Then
Dim Parentid
Parentid=request.QueryString("Parentid")
IF Parentid="" or Not Isnumeric(Parentid) Then
Response.Write "非法参数"
Response.End()
End IF
Dim Parent,Catename
Parent=Request.Form("Parent")
Catename=Trim(Request.Form("catename"))
IF Catename="" Then
Response.Write "类别名称不能为空"
Response.End()
End IF
IF Parent=Parentid Then
Response.Write "不能将当前类别作为自己的父类"
Response.End()
End IF
IF Parent<>"" Then
 Rem 开始删除原父类
 Sql2="Select * From MenuTree where instr(Childid,"&Parentid&")<>0"
 Set Rs2=Server.CreateObject("ADODB.Recordset")
 Rs2.open Sql2,Conn,1,3
 IF Not Rs2.Eof Then
  IF Instr(Rs2(2),",")<>0 Then
   IF Right(Rs2(2),Len(Parentid))=Parentid Then
   Rs2(2)=Replace(Rs2(2),","&Parentid,"")
   Else
   Rs2(2)=Replace(Rs2(2),Parentid&",","")
   End IF
  Else
   Rs2(2)=Null
  End IF
 Rs2.Update
 End IF
 Rs2.Close:Set Rs2=Nothing
 Rem 设置新的父类
 Sql3="Select * From MenuTree where M_ID="&Parent
 Set Rs3=Server.CreateObject("ADODB.Recordset")
 Rs3.open Sql3,Conn,1,3
 IF Not Rs3.Eof Then
  IF Not Isnull(Rs3(2)) Then
  Rs3(2)=Rs3(2)&","&Parentid
  Else
  Rs3(2)=Parentid
  End IF
 Rs3.Update
 Layer=Rs3(3)
 Rs3.Close:Set Rs3=Nothing
 End IF
 Conn.Execute("Update MenuTree Set M_Name='"&Catename&"',Depth="&Layer&"+1 where M_ID="&Parentid&"")
Else
Conn.Execute("Update MenuTree Set M_Name='"&Catename&"' where M_ID="&Parentid&"")
End IF
Response.Write "<script>alert('修改成功!');location.href='MenuTree.asp'</script>"
End IF
'=================结束保存
Parentid=request.QueryString("Parentid")
IF Parentid="" or Not Isnumeric(Parentid) Then
Response.Write "非法参数"
Response.End()
End IF
Dim Rs,Sql
Sql="Select * From MenuTree where M_ID="&Parentid
Set Rs=Conn.Execute(Sql)
IF Rs.Eof Then
Response.Write "对不起,找不到指定记录"
Response.End()
Else
Depth=Rs(3)
Set Prs=Conn.Execute("Select M_ID From MenuTree where instr(Childid,"&Parentid&")<>0")
IF Not Prs.Eof Then
P_ID=Prs("M_ID")
Prs.close:Set Prs=Nothing
End IF
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="ASP无限级分类" />
<meta name="description" content="ASP无限级分类,2006-9-18" />
<meta name="Author" content="江生华">
<title>ASP无限级分类</title>
<style>
<!--
body{font-size:12px;color:#333333;line-height:20px;}
input{border:1px solid #CCCCCC;background-color:#EEEEEE;}
#Form{border:1px solid #CCCCCC;background-color:#F5F5F5;margin:auto;Padding-top:5px;Padding-bottom:5px;width:700px;height:20px;line-height:25px; text-align:center;}
-->
</style>
<script>
function check(){
 <%IF Rs(3)<>0 Then%>
 if(document.form.Parent.value=="")
 {
 alert("必须选择父类");
 document.form.Parent.focus();
 return false
 }
 <%End IF%>
 if(document.form.catename.value.length<1)
 {
 alert("乖,填了父类名称我就让你提交!!");
 document.form.catename.focus();
 return false
 }
}
</script>
</head>
<body>
    <DIV id="Form">
 <Form name="form" action="?Action=Save&Parentid=<%=Request("Parentid")%>" method="post" οnsubmit="return check()" style="margin:0px;">
 <%IF Rs(3)<>0 Then%>
 父类:<select name="Parent">
 <%
 Sub Children(str)
 IF Isnull(str) Then Exit Sub
  Dim Crs,Csql
  Set Crs=Server.CreateObject("ADODB.Recordset")
  Csql="Select * From MenuTree where M_ID in ("&str&")"  
  '使用in的话字段Childid的值必须是以逗号作分割符,否则需split或Replace
  Crs.open Csql,conn,1
  IF Not Crs.Eof Then
  Dim MenuList:MenuList=Crs.Getrows()
  Crs.Close:Set Crs=Nothing
  End IF
  For i=0 to Ubound(MenuList,2)
      Response.Write "<option value='"&MenuList(0,i)&"'"
   IF MenuList(0,i)=P_ID Then
   Response.Write " Selected"
   End IF
   Response.Write ">"
   For j=0 to MenuList(3,i)       '通过深度来调整缩进距离,以求层次分明而且美观
   Response.Write "  "
   Next
   Response.Write "|---"&MenuList(1,i)&"<option>"
   IF Not Isnull(MenuList(2,i)) then
   Call Children(MenuList(2,i))
   End IF
  Next
 End Sub
 Dim Rs1
 Set Rs1=Server.CreateObject("ADODB.Recordset")
 Rs1.open "Select * From MenuTree where Depth=0",Conn,1
 IF Not Rs1.Eof Then
 Do While Not Rs1.Eof
 Response.Write "<option value='"&Rs1(0)&"'>|--"&Rs1(1)&"<option>"
  IF Not Isnull(Rs1(2)) Then
  Call Children(Rs1(2))
  End IF
 Rs1.Movenext()
 Loop
 End IF
 Rs1.Close:Set Rs1=Nothing
 %>
 </select>
 <%End IF%> 
 类名称:
 <input type="text" name="catename" size="20" value="<%=Rs(1)%>">   
 <input type="submit" value="提 交" name="submit">
 </Form>
 </DIV>
<%
Rs.close
Set Rs=Nothing
End IF
Closeconn
%>
</body>
</html>
======================================================
文件名:Del.asp,删除类别
======================================================
<!--#include file="Conn.asp"-->
<%
Parentid=request.QueryString("Parentid")
IF Parentid="" or Not Isnumeric(Parentid) Then
Response.Write "非法参数"
Response.End()
End IF
Sql="Select * From MenuTree where M_ID="&Parentid
Set Rs=Server.CreateObject("ADODB.Recordset")
Rs.open Sql,Conn,1,3
IF Rs.Eof Then
Response.Write "对不起,找不到指定记录"
Response.End()
Else
 Set Prs=Server.CreateObject("ADODB.Recordset")
 Psql="Select * From MenuTree where instr(Childid,"&Parentid&")<>0"
 Prs.open Psql,Conn,1,3
 IF Not Prs.Eof Then
     IF Instr(Prs(2),",")<>0 Then
   IF Right(Prs(2),Len(Parentid))=Parentid Then
   Prs(2)=Replace(Prs(2),","&Parentid,"")
   Else
   Prs(2)=Replace(Prs(2),Parentid&",","")
   End IF
  Else
   Prs(2)=Null
  End IF
 Prs.Update
 Prs.close:Set Prs=Nothing
 End IF
 IF Trim(Rs(2))<>"" Then
 Conn.Execute("Delete * From MenuTree where M_ID in ("&Rs(2)&")")
 End IF
Rs.Delete
Rs.close:Set Rs=Nothing
End IF
Closeconn
Response.Write "<script>alert('删除成功!');location.href='MenuTree.asp'</script>"
%>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值