一:分类
假分页:是把所有的记录都从数据库种取出来,然后再把这些记录分页
真分页:先分页,再把对应页的记录从数据库中取出来
比较:真分页效率较高,因为每次只需取出所需的内容,相对来说,去的内容较少,执行就快了
二:真分页
1.下载AspNetPager.dll,提取密码为eyyp
2.工具箱右击——选择项——添加AspNetPager.dll文件
3.将该控件拉到.asp的设计页面中的相应位置
4.在源代码中修改代码为:
<webdiyer:AspNetPager ID="anp" runat="server" OnPageChanged="anp_PageChanged" PageSize="5"> </webdiyer:AspNetPager>
5.双击AspNetPager控件,进入PageChanged事件的编写(即当页改变时):
protected void anp_PageChanged(object sender, EventArgs e) { int startPageIndex = anp.StartRecordIndex; int endPageIndex = anp.EndRecordIndex; BindNews(startPageIndex,endPageIndex); }
Load加载代码:
anp.RecordCount = new NewsManager().SelectAll().Rows.Count; BindNews(1,5);
方法BindNews(绑定数据源的代码抽象出来了):
protected void BindNews(int startPage,int endPage) { DataTable dt = new NewsManager().selectPageNews(startPage, endPage); repNews.DataSource = dt; repNews.DataBind(); }
D层代码:
public DataTable selectPageNews(int startPage,int endPage) { SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@startPage",startPage), new SqlParameter("@endPage",endPage) }; DataTable dt = sqlHelper.ExecuteQuery("news_selectPageNews",paras, CommandType.StoredProcedure); return dt; }
存储过程:
ALTER PROCEDURE [dbo].[news_selectPageNews] @startPage int, @endPage int AS BEGIN with temptbl as ( select ROW_NUMBER() over (order by id desc)As 行号, * from news ) select * from temptbl where 行号 between @startPage and @endPage END
(临时表的建立和使用必需一块执行,如果光建临时表会执行不成功的)
PageSize:每页的大小RecordCount:记录的总条数
根据以上两个属性,可确定一共有几页,所以以上两个属性是必须有的属性
三:可能出现的问题:
1>页面在第一次加载时还是把所有的记录都显示在第一页上,当点击每页时有显示正常,这是因为在加载时,给repter绑定数据源时绑定的是所有的记录
我这把加载时第一页绑定数据源默认为1-5条记录,重用了一下存储过程,因为我的PageSize设置的是5(为保持一致)
2>如果加载时,不设置RecordCount属性,只会显示第一页的内容,且不会出现AspNetPager控件
四:总结
实践会掌握更多,更能开阔代码思维