专栏首页Danny的专栏ASP.NET中的几种分页

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 条评论
登录 后参与评论

相关文章

  • 【软考路上】——操作系统

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

    DannyHoo
  • 数据脱敏——什么是数据脱敏

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

    DannyHoo
  • 配置ODBC数据源

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

    DannyHoo
  • Python之前准备工作,轻松安装好这些软件就可以开始入门了

    Python作为一个目前最火的编程语言之一,已经渗透到了各行各业,笔者所在的人工智能科研领域就以Python为主要编程语言,尤其是神经网络几乎已经离不开Pyth...

    HuangWeiAI
  • 持续部署入门:基于 Kubernetes 实现蓝绿发布

    前言 软件世界比以往任何时候都更快。为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验。越来越多企业已将其应用迁移到 Kubern...

    腾讯云原生
  • 零基础到精通Python,从这篇文章开始

    关键词:Python,入门 正文: 本文由rever4433, Tocy, Tony, 南宫冰郁, 透过树叶的光等协作翻译,发表于开源中国。 什么是 Pytho...

    小莹莹
  • Zeppelin: 让大数据插上机器学习的翅膀

    导语:在数字化、智能化的时代,通过机器学习(Machine Learning)能够强有力的补充 Hadoop 大数据系统的数据处理能力,充分挖掘大数据的核心价值...

    Fayson
  • Go Modules 如何创建和发布 v2 及更高版本?

    随着一个成功的项目的逐渐成熟和新需求的添加,过去的功能和设计决策可能会失去意义。开发人员可能希望整合通过删除已弃用函数学到的经验教训,重命名类型,或将复杂的包拆...

    frank.
  • 带你入门机器学习与TensorFlow2.x

    本文主要介绍人工智能、机器学习和深度学习的区别,以及软硬件环境的搭建,包括Tensorflow1.x和Tensorflow2.x在同一台机器上如何共存。在后续的...

    蒙娜丽宁
  • Go 模块:v2 及更高版本

    随着一个成功项目的成熟和新需求的增加,过去的特性和设计决策可能不再有意义。开发人员可能希望通过删除不推荐的函数、重命名类型或将复杂的包拆分成可管理的部分来集成他...

    Dabelv

扫码关注云+社区

领取腾讯云代金券