[转]ASP.NET无限分类
开始在网上查找到asp的无限分类,但是asp.net的几乎找不到,找到的也是跟TreeView结合起来的.
找到asp版本的代码有几种,原来都差不多是采用递归算法.
其中表结构都是如下:
表名称是ClassName
id 主键
sid 对应的父类的id
ClassName 对应类别的名称.
代码段一:
另外一段代码就跟上面原理就一样的.只不过是加入了树型结构的显示方式.
代码段二:
我参考上面的代码改成了asp.net版本的无限分类.开始遇到了语法上的限制.当时的处理是直接把rs换成SqlDataReader,然后加以修改,代码如下(错误代码):
测试数据库的表Tree结构是:id,ParentID,Name。
错误原因是SqlDataReader每次使用之后都需要关闭,所以DataReader是不可以嵌套使用的.
后来我改成了用DataTable的形式实现了无限分类,但是感觉这种方式的效率不高,需要改进(还在研究中)
修改后的代码如下:
虽然是实现了无限分类,但是效率还是挺低,努力探索更高的效率。
找到asp版本的代码有几种,原来都差不多是采用递归算法.
其中表结构都是如下:
表名称是ClassName
id 主键
sid 对应的父类的id
ClassName 对应类别的名称.
代码段一:
1 function loadNextType(upid,rank)
function loadNextType(upid,rank)
2 dim rs
    dim rs
3 set rs="select * from classname where sid="&upid
    set rs="select * from classname where sid="&upid
4 do while not rs.eof
    do while not rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
       loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6 rs.movenext
       rs.movenext
7 loop
    loop
8 end function
end function
调用时:response.write(loadNextType(0,0)) function loadNextType(upid,rank)
function loadNextType(upid,rank)2
 dim rs
    dim rs3
 set rs="select * from classname where sid="&upid
    set rs="select * from classname where sid="&upid4
 do while not rs.eof
    do while not rs.eof5
 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
       loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)6
 rs.movenext
       rs.movenext7
 loop
    loop8
 end function
end function另外一段代码就跟上面原理就一样的.只不过是加入了树型结构的显示方式.
代码段二:
 1 '定义第一级分类
'定义第一级分类
2 sub mainfl()
sub mainfl()
3 dim rs
       dim rs
4 set rs=conn.execute("select id,F_id,F_name from ClassNae where sid=0 order by id desc")
       set rs=conn.execute("select id,F_id,F_name from ClassNae where sid=0 order by id desc")
5 if not rs.eof then
       if not rs.eof then
6 do while not rs.eof
          do while not rs.eof
7 response.write rs(2) & "<br>"
          response.write rs(2) & "<br>"
8 call subfl(rs(0),"  |-") '循环子级分类
          call subfl(rs(0),"  |-") '循环子级分类
9 rs.movenext
          rs.movenext
10 if rs.eof then exit do '防上造成死循环
          if rs.eof then exit do '防上造成死循环
11 loop
          loop
12 end if
          end if
13 end sub
end sub
14 '定义子级分类
'定义子级分类
15 sub subfl(fid,strdis)
sub subfl(fid,strdis)
16 dim rs1
       dim rs1
17 set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
       set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
18 if not rs1.eof then
       if not rs1.eof then
19 do while not rs1.eof
       do while not rs1.eof
20 response.write rs1(2) & "<br>"
       response.write rs1(2) & "<br>"
21 call subfl(rs1(0),"  "&strdis) '递归子级分类
       call subfl(rs1(0),"  "&strdis) '递归子级分类
22 rs1.movenext
       rs1.movenext
23 if rs1.eof then
       if rs1.eof then
24 rs1.close
       rs1.close
25 exit sub
       exit sub
26 end if
       end if
27 loop
       loop
28 end if
       end if
29 end sub
end sub
 '定义第一级分类
'定义第一级分类2
 sub mainfl()
sub mainfl()3
 dim rs
       dim rs4
 set rs=conn.execute("select id,F_id,F_name from ClassNae where sid=0 order by id desc")
       set rs=conn.execute("select id,F_id,F_name from ClassNae where sid=0 order by id desc")5
 if not rs.eof then
       if not rs.eof then6
 do while not rs.eof
          do while not rs.eof7
 response.write rs(2) & "<br>"
          response.write rs(2) & "<br>"8
 call subfl(rs(0),"  |-") '循环子级分类
          call subfl(rs(0),"  |-") '循环子级分类9
 rs.movenext
          rs.movenext10
 if rs.eof then exit do '防上造成死循环
          if rs.eof then exit do '防上造成死循环11
 loop
          loop12
 end if
          end if13
 end sub
end sub14
 '定义子级分类
'定义子级分类15
 sub subfl(fid,strdis)
sub subfl(fid,strdis)16
 dim rs1
       dim rs117
 set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
       set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")18
 if not rs1.eof then
       if not rs1.eof then19
 do while not rs1.eof
       do while not rs1.eof20
 response.write rs1(2) & "<br>"
       response.write rs1(2) & "<br>"21
 call subfl(rs1(0),"  "&strdis) '递归子级分类
       call subfl(rs1(0),"  "&strdis) '递归子级分类22
 rs1.movenext
       rs1.movenext23
 if rs1.eof then
       if rs1.eof then24
 rs1.close
       rs1.close25
 exit sub
       exit sub26
 end if
       end if27
 loop
       loop28
 end if
       end if29
 end sub
end sub我参考上面的代码改成了asp.net版本的无限分类.开始遇到了语法上的限制.当时的处理是直接把rs换成SqlDataReader,然后加以修改,代码如下(错误代码):
测试数据库的表Tree结构是:id,ParentID,Name。
 1 private void Display(string parentid/*, int rank*/)
private void Display(string parentid/*, int rank*/)
2 {
    {
3 SqlDataReader dr;
        SqlDataReader dr;
4 SqlCommand cmd;
        SqlCommand cmd;
5 String strSQL;
        String strSQL;
6
7 strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";
        strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";
8 cmd = new SqlCommand(strSQL,conn);
        cmd = new SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
        //cmd.Connection.Open();
10
11 using(dr = cmd.ExecuteReader())
        using(dr = cmd.ExecuteReader())
12 {
        {
13 while(dr.Read())
            while(dr.Read())
14 {
            {
15 Response.Write(dr["Name"].ToString() + "<br>");
                Response.Write(dr["Name"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
                Display(dr["ID"].ToString());
17 }
            }
18 }
        }
19 cmd.Connection.Close();
        cmd.Connection.Close();
20 }
    }
调用使用Display("0"). private void Display(string parentid/*, int rank*/)
private void Display(string parentid/*, int rank*/)2
 {
    {3
 SqlDataReader dr;
        SqlDataReader dr;4
 SqlCommand cmd;
        SqlCommand cmd;5
 String strSQL;
        String strSQL;6

7
 strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";
        strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";8
 cmd = new SqlCommand(strSQL,conn);
        cmd = new SqlCommand(strSQL,conn);9
 //cmd.Connection.Open();
        //cmd.Connection.Open();10

11
 using(dr = cmd.ExecuteReader())
        using(dr = cmd.ExecuteReader())12
 {
        {13
 while(dr.Read())
            while(dr.Read())14
 {
            {15
 Response.Write(dr["Name"].ToString() + "<br>");
                Response.Write(dr["Name"].ToString() + "<br>");16
 Display(dr["ID"].ToString());
                Display(dr["ID"].ToString());17
 }
            }18
 }
        }19
 cmd.Connection.Close();
        cmd.Connection.Close();20
 }
    }错误原因是SqlDataReader每次使用之后都需要关闭,所以DataReader是不可以嵌套使用的.
后来我改成了用DataTable的形式实现了无限分类,但是感觉这种方式的效率不高,需要改进(还在研究中)
修改后的代码如下:
 1 private void Display(string parentid, String space)
private void Display(string parentid, String space)
2 {
    {
3 DataTable dt;
        DataTable dt;
4 String strSQL;
        String strSQL;
5 strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";
        strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";
6
7 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
        SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
8 DataSet ds = new DataSet();
        DataSet ds = new DataSet();
9 sda.Fill(ds, "Tree");
        sda.Fill(ds, "Tree");
10 dt = ds.Tables["Tree"];
        dt = ds.Tables["Tree"];
11
12 if (dt.Rows.Count > 0)
        if (dt.Rows.Count > 0)
13 {
        {
14 foreach (DataRow dr in dt.Rows)
            foreach (DataRow dr in dt.Rows)
15 {
            {
16 strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
                strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), "            " + space, false);
                Display(dr["ID"].ToString(), "            " + space, false);
18 }
            }
19 }
        }
20 }
    }
调用时候使用Display("0","↓→→")。 private void Display(string parentid, String space)
private void Display(string parentid, String space)2
 {
    {3
 DataTable dt;
        DataTable dt;4
 String strSQL;
        String strSQL;5
 strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";
        strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";6

7
 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
        SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);8
 DataSet ds = new DataSet();
        DataSet ds = new DataSet();9
 sda.Fill(ds, "Tree");
        sda.Fill(ds, "Tree");10
 dt = ds.Tables["Tree"];
        dt = ds.Tables["Tree"];11

12
 if (dt.Rows.Count > 0)
        if (dt.Rows.Count > 0)13
 {
        {14
 foreach (DataRow dr in dt.Rows)
            foreach (DataRow dr in dt.Rows)15
 {
            {16
 strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
                strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";17
 Display(dr["ID"].ToString(), "            " + space, false);
                Display(dr["ID"].ToString(), "            " + space, false);18
 }
            }19
 }
        }20
 }
    }虽然是实现了无限分类,但是效率还是挺低,努力探索更高的效率。
 
                    
                     
                    
                 
                    
                
 


 
         
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号