1、通过DataGrid控件实现分页
ASP.NET中的DataGrid控件自带了分页功能,当绑定了DataGrid的数据源之后,需要对DataGrid控件进行一些设置:
左击控件右上角的小箭头→属性生成器:
选择左边的【分页】选项卡
选中【允许分页】;【页大小】表示一页显示多少条数据;导航按钮的【位置】有顶、底、上下型三种选择,【模式】有页码和“上一页、下一页按钮”,如果选择了页码模式,【数值按钮】表示最多显示的按钮数量,如果选择了另一种模式,“上一页”、“下一页”可以编辑成其他文本。
下面就到代码,为DataGrid控件添加并绑定数据源:
为了方便,先写一个查询数据并绑定到DataGrid的函数BindToGridView():
private void BindToDataGrid() { SqlConnection conn = DB.CreateConnection(); //定义数据库连接对象 conn.Open(); //打开数据库连接 string cmdText = "select * from T_Employee"; //从员工表中查询所有信息 SqlCommand cmd = new SqlCommand(cmdText, conn); //定义命令对象 SqlDataAdapter sda = new SqlDataAdapter(cmd); //定义适配器对象 DataTable dt = new DataTable(); //定义DataTable表dt sda.Fill(dt); //填充DataTable表dt DataGrid1.DataSource = dt; //将DataGrid1的数据源设为为dt DataGrid1.DataBind(); //DataGrid绑定数据源 }
此时就会出现分页的效果:
但是点击下一页时,并不会跳转到下一页,这时因为点击时所触发的是该控件的PageIndexChanged事件,所以点击后需要重新绑定:
protected void DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e) { this.DataGrid1.CurrentPageIndex = e.NewPageIndex; //跳转到所指定的新的页面 BindToDataGrid(); //重新绑定控件 }
2、通过System.Web.UI.WebControls.PagedDataSource实现分页
PageDataSource类中封装了与分页相关的属性,通过PageDataSource类,可以使得Repeater和DataList进行分页显示,而且Repeater和DataList也比DataGrid显示形式多样化。
定义一个静态变量curPage、pageSize分别用来表示当前页和页大小:
private static int curPage=1; //默认显示第一页 private static int pageSize=3; //默认每页显示三条数据
为了方便,先写一个根据当前页、页大小来分页并绑定数据的函数DataBindToRepeter():
private void DataBindToRepeter() { SqlConnection conn = DB.CreateConnection(); //定义数据库连接对象 conn.Open(); //打开数据库连接 string cmdText = "select * from People"; //从员工表中查询所有信息 SqlCommand cmd = new SqlCommand(cmdText, conn); //定义命令对象 SqlDataAdapter sda = new SqlDataAdapter(cmd); //定义适配器对象 DataTable dt = new DataTable(); //定义DataTable表dt sda.Fill(dt); //填充DataTable表dt int curPage = int.Parse(this.Label2.Text); System.Web.UI.WebControls.PagedDataSource pds = new PagedDataSource(); //实例化PageDataSource类pds pds.DataSource = dt.DefaultView; //获取dt的筛选视图 pds.AllowPaging = true; //允许分页 pds.PageSize = 3; //页大小为3 pds.CurrentPageIndex = curPage - 1; //当前页码,从零开始 Repeater1.DataSource = pds; //将PageDataSource的实例ps设置为Repeter控件的数据源 Repeater1.DataBind(); //绑定数据源 }
这里手动添加上一页(btnPre)、下一页(btnNext)两个按钮,每次点击按钮时,根据事件分别让curPage的值减一或加一然后重新绑定:
protected void btnPre_Click(object sender, EventArgs e) { curPage=curPage-1; //向前翻页 DataBindToRepeter(); // 重新绑定 } protected void btnNext_Click(object sender, EventArgs e) { curPage=curPage+1; //向后翻页 DataBindToRepeter(); // 重新绑定 }
PageDataSource分页的原理:PageDataSource相当于先把数据提取出来,再根据页面大小和需要显示的当前页进行分页和显示。由于需要先把所有的数据提取出来,所以当需要显示的数据量较为庞大时,此方法性能不是很合理。
3、通过存储过程分页
通过存储过程实现分页,根据条件,只从数据库中提取出要显示的那一页中的数据,那么就涉及到了假如数据库中共有100条数据,如何从数据库中取出第50到第60条数据来。这时想到了牛腩大哥视频里所讲的真假分页以及如何提取表中中间连续的几条数据。
在程序中定义如下变量pageSize(每个页面显示多少条记录)、curPage(当前在第几页)。通过这些就可以计算出需要显示数据库中的数据是从第几条(beginPos)到第几条(endPos)。
这几个变量之间的关系为beginPos =(curPage-1)× pageSize+1
endPos = curPage × pageSIze
存储过程核心代码为:
CREATE PROCEDURE PRO_Paging --从第几条数据开始显示 @beginPos int, --显示到第几条数据结束 @endPos int AS BEGIN SET NOCOUNT ON; --这里用一个添加了用来为每条数据排序的rowNumber列的temptb表 with temptb as( select ROW_NUMBER() over(order by pID) as rowNumber,* from People) --查询第@beginPos条到第@endPos条的数据 select * from temptb where rowNumber between @beginPos and @endPos END GO
这种方法的优点在于,指定了要显示的页数和每页的大小之后,只需从数据库中提取要显示的那一页数据即可,不需要将大量数据全部提取出来,也就是牛腩视频中说到的“真分页”,而前面的方法即取出所有数据的分页方法就是“假分页”。