asp.net2.0中Repeater的分页使用

在.net中提供了多种分页方法,但使用最多而入门又比较容易的恐怕就非DataGrid(1.0)或GridView莫属了,这两种控件在使用时确实是非常的方便,基本上不需要写代码就搞定了,尤其是GridView。但这两种控件也有使用不方便之处,比如一个由web2.0定义的前台页面里加入GridView很是麻烦,特别是像我这样的菜鸟。^_^而经过使用了几种控件后我还是选择了Repeater,这个控件用法非常简单,有点像asp里面的分页的那种感觉(只是比喻一下,并不是误导各位说.net没有asp好,这两个还是不能相提并论的!!);在使用Repeater时只要在需要循环的位置加入:

<Repeater id="infolist" runat="server>
<ItemTemplate>
这里就是需要循环的内容了....
</ItemTemplate>
</Repeater>
这样就可以了,很方便吧,这样的话既使页面再怎么复杂也不会受到影响了,而且我在2.0中发现Repeater还可以嵌套,用起来真的挺自由的。虽然Repeater在前台使用比较灵活自由,但有一个问题就是Repeater不支持直接分页,这个很多人看起来就有点不想用了,但我想大家都知道GridView控件或DataGrid控件在启用自带分页的时候其实效率是非常低的,大的不说,一但到了百万级数据以后,就会感觉是多么的痛苦和无耐了,所以既使是使用DataGrid(GridView)控件,高手们还是只会只使用一个界面而已,而分页肯定都是自己写的,这样一比较利弊就出来了,既然这样那就选择Repeater吧,我在这里正好结合一下效率还算可以的双top分页法一起使用,对付百万级的数据量是足够了(如果还不够的话那你只能另想他法或生成静态了)

其实双top的原理非常简单,其实就是一句Sql语句,一看就明白!

    TimeSpan newtimespan  =  DateTime.Now.TimeOfDay; // 运行时间开始
         int  pagesize  =   20 ;
        
int  cpage  =  Convert.ToInt32(page);
        
string  sql = "" ;
        
string  sqlstr  =   " select count(*) from komain_vote " ;
        SqlConnection myConnection 
=   new  SqlConnection(ConfigurationSettings.AppSettings[ " ConnectionString " ]);
        SqlCommand myCommand 
=   new  SqlCommand(sqlstr, myConnection);
        myConnection.Open();
        
int  totalput  =  Convert.ToInt32(myCommand.ExecuteScalar());

        
int  maxpage  =   1 ;
        
if  (totalput  %  pagesize  ==   0 )
        {
            maxpage 
=  totalput  /  pagesize;
        }
        
else
        {
            maxpage 
=  totalput  /  pagesize  +   1 ;
        }
        
if  (maxpage  ==   0 ) { maxpage  =   1 ; }
        
if  (cpage  <   1 ) { cpage  =   1 ; }
        
else   if  (cpage  >  maxpage) { cpage  =  maxpage; }

        
if  (totalput  !=   0 )
        {
            
if  (cpage  ==   1 )
            {
                sql 
=   " select top  "   +  pagesize  +   "  * from komain_vote order by id desc " ;
            }
            
else
            {
                sql 
=   " select top  "   +  pagesize  +   "  * from komain_vote where id not in(select top  "   +  (cpage  -   1 *  pagesize  +   "  id from komain_vote order by id desc) order by id desc " ;
            }
        }

        SqlDataAdapter mysda 
=   new  SqlDataAdapter(sql, myConnection);
        DataSet myds 
=   new  DataSet();
        mysda.Fill(myds);
        mysda.Dispose();


        
this .Label1.Text  =   " 共有信息 "   +  totalput.ToString()  +   " 条  当前是第 "   +  cpage.ToString()  +   " / "   +  maxpage.ToString()  +   " 页   " ;
            
if (cpage != 1 ){
                
this .HyperLink1.Text = " 首页 " ;
                
this .HyperLink1.NavigateUrl = " vote.aspx?page=1 " ;
                
this .HyperLink2.Text = " 上一页 " ;
                
this .HyperLink2.NavigateUrl = " vote.aspx?page= " + Convert.ToString(cpage - 1 );}
            
else {
                
this .HyperLink1.Text = " 首页 " ;
                
this .HyperLink2.Text = " 上一页 " ;
            }
            
if (cpage != maxpage){
                
this .HyperLink3.Text = " 下一页 " ;
                
this .HyperLink3.NavigateUrl = " vote.aspx?page= " + Convert.ToString(cpage + 1 );
                
this .HyperLink4.Text = " 尾页 " ;
                
this .HyperLink4.NavigateUrl = " vote.aspx?page= " + maxpage.ToString();}

          

            
this .votelist.DataSource  =  myds.Tables[ 0 ].DefaultView;
            
this .votelist.DataBind();
            runtime.Text 
=  DateTime.Now.TimeOfDay.Subtract(newtimespan).TotalMilliseconds.ToString(); // 算出运行时间并附值给Label控件(runtime)

虽然看上去挺多的,但我是直接从vs里复制出来的,所有的东西都比较全了,只是核心的话就一小段。

核心语句:sql = "select top " + pagesize + " * from komain_vote where id not in(select top " + (cpage - 1) * pagesize + " id from komain_vote order by id desc) order by id desc";

但我在这句的上页加了一句(sql = "select top " + pagesize + " * from komain_vote order by id desc";)
这样的话我觉得会有提高一点效率的功能,也就是说当前页是第一页的时候就不用再去计算分页过程了,直接读取20条数据就行了(在这里我定义的是每页显示20条数据)

但这样的话效率还不是非常高,相必都知道分页中其实统计数据所占的时间是比较长的,尤其是数据量非常大的时候,虽然count(*)已经很快了,但我给大家提个建议:“在数据库里新建一个表或xml文件,专门用来放统计信息数量的,这样的话数据总数据就可以直接从数据库或xml文件中读取了,比统计来说那是快了不少(我在这里说的都是针对大形数据库的,如果本身的数据量都不超过1000就没这个必要了)

注:我在自己的老本本上用一百万条数据作测试,发现最快的时候在前几百页可以达到10~60毫秒之间,既使是翻到了最后一页也只用了不到700毫秒,这个速度还算是比较理想吧,必竟我的本本太老了。^_^
 
  • 0
    点赞
  • 2
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值