程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET無限分類

ASP.NET無限分類

編輯:.NET實例教程


開始在網上查找到asp的無限分類,但是ASP.Net的幾乎找不到,找到的也是跟TreeVIEw結合起來的.
找到ASP版本的代碼有幾種,原來都差不多是采用遞歸算法.
其中表結構都是如下:
表名稱是ClassName
id                     主鍵
sid                    對應的父類的id
ClassName        對應類別的名稱.
代碼段一:
1function loadNextType(upid,rank)
2    dim rs
3    set rs="select * from classname where sid="&upid
4    do while not rs.eof
5       loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6       rs.movenext
7    loop
8end function調用時:response.write(loadNextType(0,0))

另外一段代碼就跟上面原理就一樣的.只不過是加入了樹型結構的顯示方式.
代碼段二:
 1'定義第一級分類
 2sub mainfl()
 3       dim rs
 4       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
 6          do while not rs.eof
 7          response.write rs(2) & "<br>"
 8          call subfl(rs(0),"  |-") '循環子級分類
 9          rs.movenext
10          if rs.eof then exit do '防上造成死循環
11          loop
12          end if
13end sub
14'定義子級分類
15sub subfl(fid,strdis)
16       dim rs1
17       set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
18       if not rs1.eof then
19       do while not rs1.eof
20       response.write rs1(2) & "<br>"
21       call subfl(rs1(0),"  "&strdis) '遞歸子級分類
22       rs1.movenext
23       if rs1.eof then
24       rs1.close
25       exit sub
26       end if
27       loop
28       end if
29end sub
我參考上面的代碼改成了ASP.Net版本的無限分類.開始遇到了語法上的限制.當時的處理是直接把rs換成SqlDataReader,然後加以修改,代碼如下(錯誤代碼):
測試數據庫的表Tree結構是:id,ParentID,Name。
 1private void Display(string parentid/**//*, int rank*/)
 2 &nbsp;  {
 3        SqlDataReader dr;
 4        SqlCommand cmd;
 5        String strSQL;
 6
 7        strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";
 8        cmd = new SqlCommand(strSQL,conn);
 9        //cmd.Connection.Open();
10
11        using(dr = cmd.ExecuteReader())
12        {
13            while(dr.Read())
14            {
15                Response.Write(dr["Name"].ToString() + "<br>");
16                Display(dr["ID"].ToString());
17            }
18        }
19        cmd.Connection.Close();
20    }調用使用Display("0").
錯誤原因是SqlDataReader每次使用之後都需要關閉,所以DataReader是不可以嵌套使用的.
後來我改成了用DataTable的形式實現了無限分類,但是感覺這種方式的效率不高,需要改進(還在研究中)
修改後的代碼如下:
 1private void Display(string parentid, String space)
 2    {
 3        DataTable dt;
 4        String strSQL;
 5        strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";
 6
 7        SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
 8        DataSet ds = new DataSet();
 9        sda.Fill(ds, "Tree");
10        dt = ds.Tables["Tree"];
11
12        if (dt.Rows.Count > 0)
13        {
14            foreach (DataRow dr in dt.Rows)
15            {
16                strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17                Display(dr["ID"].ToString(), "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + space, false);
18     
  }
19        }
20    }調用時候使用Display("0","↓→→")。
雖然是實現了無限分類,但是效率還是挺低,努力探索更高的效率。


出處:P.Dragon's Blog

     



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved