P.Dragon's Blog

.NET学习,生活点滴。
posts - 18, comments - 41, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

ASP.NET无限分类

Posted on 2006-03-23 09:51 P.Dragon's Blog 阅读(2473) 评论(10)  编辑 收藏 所属分类: Sql Server, ASP.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    {
 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","↓→→")。
虽然是实现了无限分类,但是效率还是挺低,努力探索更高的效率。
0
0
(请您对文章做出评价)
« 上一篇:using (XX xx = ...) 的含义
» 下一篇:网上女友和现实女友的对话

Feedback

#1楼   回复  引用  查看    

2006-03-23 10:35 by 补丁      
XML用来处理结构
数据库用来存储数据

#2楼   回复  引用    

2006-03-23 11:08 by HD
还以为说什么呢!

#3楼   回复  引用  查看    

2006-03-23 11:14 by laifangsong      

这边也有个 无限级分类,你可以看看。

http://jiny-z.cnblogs.com/archive/2006/03/16/351250.html

#4楼   回复  引用  查看    

2006-03-23 17:23 by 韦恩卑鄙      
N叉树 适合关系数据库的就那么几种
强烈不推荐xml方式

#5楼[楼主]   回复  引用  查看    

2006-03-23 18:06 by P.Dragon's Blog      
@补丁
不知道用xml怎么处理??有详细的说明吗??

#6楼   回复  引用  查看    

2006-03-23 19:35 by YAO.NET℡      
C#的递归是有层数限制的。我测试过超过300就不行了,这只是有限的“无限”。
要真正实现无限分类,得用其它办法。不过一般情况下300层也够了。

#7楼   回复  引用    

2006-03-24 10:31 by yukai zhao[未注册用户]
c#递归还有这种限制?!

#8楼   回复  引用    

2006-03-30 14:21 by 锦瑟[未注册用户]
像这种树型结构的数据都可以用while来取代递归,非递归算法的效率一般都比较高。

#9楼   回复  引用    

2006-06-20 16:04 by 为了能明白[未注册用户]
strOpinion 这个有什么作用的啊?
有没有VB写的啊?

#10楼   回复  引用  查看    

2009-10-31 13:40 by 云淡风轻-.net      
不觉得每次递归所占用的连接也很多么,如果一次连接取出来再进行处理可能更好,研究中