asp.net2.0中Repeater的分页使用 [摘自http://blog.csdn.net/hackhu/]

在.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就没这个必要了)

评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明