ASP.NET中的几种分页

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/39644255

        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

       这种方法的优点在于,指定了要显示的页数和每页的大小之后,只需从数据库中提取要显示的那一页数据即可,不需要将大量数据全部提取出来,也就是牛腩视频中说到的“真分页”,而前面的方法即取出所有数据的分页方法就是“假分页”。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端说吧

vue-awesome-swiper - 基于vue实现h5滑动翻页效果

说到h5的翻页,很定第一时间想到的是swiper。但是我当时想到的却是,vue里边怎么用swiper?!

6313
来自专栏何俊林

Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程

前言:前一篇的mediaPlayer框架,对于各个模块的关系,得先从核心类MediaPlayer铺开,同样看下今天的Agenda: MediaPlayer从cr...

3025
来自专栏琯琯博客

ThinkPHP3.2 国际化功能实现

2925
来自专栏Python中文社区

用Python爬取东方财富网上市公司财务报表

摘要: 现在很多网页都采取JavaScript进行动态渲染,其中包括Ajax技术。有的网页虽然也用Ajax技术,但接口参数可能是加密的无法直接获得,比如淘宝;有...

1.6K3
来自专栏CRPER折腾记

React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏

4612
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(80)-自由桌面

系列目录 前言 这次我们来做一个有趣的事情,有朋友跟做了很远,找我要自由桌面的代码,这次我们将演示自由桌面的代码。 自由桌面:用户可以随意增删改桌面的布局、...

32410
来自专栏大内老A

扩展UltraGrid控件实现对所有数据行的全选功能[Source Code下载]

在前面一篇文章中,我通过对三种Infragistics 控件(UltraToolBarManager、UltraGird和UltraListView)进行扩展,...

28410
来自专栏Android机动车

走进SurfaceView

最近在写视频播放器的时候用到了SurfaceView和MediaPlayer,在各个功能完成后,竟得意忘形,感觉自己又get到新技能,可以嘚瑟几天了,直到前两天...

1452
来自专栏Jaycekon

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容。主要是对电脑笔记本以及他们的属性进行抓取,然后在使...

4415
来自专栏hotqin888的专栏

用beego进行onlyoffice document server的二次开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

2032

扫码关注云+社区

领取腾讯云代金券