ASP.NET中的几种分页
1、通过DataGrid控件实现分页
ASP.NET中的DataGrid控件自带了分页功能,当绑定了DataGrid的数据源之后,须要对DataGrid控件进行一些设置:
左击控件右上角的小箭头→属性生成器:
选择左边的【分页】选项卡
选中【同意分页】。【页大小】表示一页显示多少条数据;导航button的【位置】有顶、底、上下型三种选择。【模式】有页码和“上一页、下一页button”。假设选择了页码模式。【数值button】表示最多显示的button数量,假设选择了还有一种模式,“上一页”、“下一页”能够编辑成其它文本。
以下就到代码,为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)两个button,每次点击button时,依据事件分别让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
这样的方法的长处在于。指定了要显示的页数和每页的大小之后,仅仅需从数据库中提取要显示的那一页数据就可以。不须要将大量数据所有提取出来,也就是牛腩视频中说到的“真分页”,而前面的方法即取出所有数据的分页方法就是“假分页”。