在.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就没这个必要了)
注:我在自己的老本本上用一百万条数据作测试,发现最快的时候在前几百页可以达到10~60毫秒之间,既使是翻到了最后一页也只用了不到700毫秒,这个速度还算是比较理想吧,必竟我的本本太老了。^_^
<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就没这个必要了)
注:我在自己的老本本上用一百万条数据作测试,发现最快的时候在前几百页可以达到10~60毫秒之间,既使是翻到了最后一页也只用了不到700毫秒,这个速度还算是比较理想吧,必竟我的本本太老了。^_^