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语句,一看就明白!
虽然看上去挺多的,但我是直接从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就没这个必要了)
<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)
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就没这个必要了)
评论
发表评论