一、前端准备工作

1、之前我写到过《Asp.net中引用AspNetPager.dll进行数据分页》  这种分页方式只能在前台将数据分页,而每次点击查询时对目标数据库还是全查询,这样不仅会消耗数据库资源,还会加长等待时间,所以本文我将介绍如何通过存储过程对数据进行真分页。

2、参考前文将基础搭建完成。

二、分页存储过程。

1、在真分页中,我们要将每一页的数据量,起始行这些发送给后端,后端接收到指令后则按照这个区间进行查询数据,后端数据分页方式在前文中我有详细介绍过。

2、后端分页:SQL Server的两种数据分页方式简析 ,参考此文的分页方式选择合适自己后端分页方法,后面我使用的是存储过程分页-GetPageRecords。

三、页面代码

PS:在AspNetPager.dl开发者官网,也有其它调用方式和用法,大家可以看看有没有新的思路,对于分页控件样式,网上有一些CSS样式可以参考,建议看看,因为原格式实在有些单调。

 <webdiyer:AspNetPager ID="AspNetPager1" runat="server" PageSize="25"
HorizontalAlign="Center" Width="100%"
meta:resourceKey="AspNetPager1" Style="font-size: 14px"
AlwaysShow="false" FirstPageText="首页" LastPageText="尾页" NextPageText="后页"
PrevPageText="前页" SubmitButtonText="Go" SubmitButtonClass="submitBtn"
CustomInfoStyle="font-size:14px;text-align:left;"
InputBoxStyle="width:25px; border:1px solid #999999; text-align:center; "
TextBeforeInputBox="转到第" TextAfterInputBox="页 " TextAfterPageIndexBox="页"
TextBeforePageIndexBox="转到" Font-Size="14px" CustomInfoHTML="共有%RecordCount%条记录,共%PageCount%页,每页%PageSize%行"
ShowCustomInfoSection="Left" CustomInfoSectionWidth="30%"
CssClass="paginator"
PagingButtonSpacing="3px" OnPageChanged="AspNetPager1_PageChanged" ShowBoxThreshold="25">
</webdiyer:AspNetPager

常用自定义项:PageSize:页面显示的行数;

CustomInfoHTML:自定义项(这里可以任意新增删除)

四、后台代码

PS:本文中的代码是从我的测试项目中扣出来的,可根据自己的项目灵活应用,如果有更好的方式和思路欢迎留言。

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//判断是否回发
{
RowDatasBind();//调用函数
}
}
//拼接页面查询条件
public string Search()
{
string SQL = "select PCB_CODE,WORK_ORDER_CODE,PRODUCTION_ORDER_ID,TEST_CODE,PLANT_CODE,CREATE_TIME,DEVICE_NO,(case CONCLUSION when 0 then '通过' when 1 then '不通过' else '其他' end) CONCLUSION from [dbo].[T_Aoi_TEST] WITH (NOLOCK) where 1=1";
if (!string.IsNullOrEmpty(txtWORK_ORDER_CODE.Text))
{
SQL = SQL + " and WORK_ORDER_CODE like'" + "%" + txtWORK_ORDER_CODE.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtPCB_CODE.Text))
{
SQL = SQL + " and PCB_CODE like'" + "%" + txtPCB_CODE.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtPRODUCTION_ORDER_ID.Text))
{
SQL = SQL + " and PRODUCTION_ORDER_ID like'" + "%" + txtPRODUCTION_ORDER_ID.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtBeginTime.Text) && !string.IsNullOrEmpty(txtEndTime.Text))
{
SQL = SQL + " and CHECK_TIME>='" + txtBeginTime.Text + "'" + " and CHECK_TIME<='" + txtEndTime.Text + "'";
}
if (ddlCon.Text != "9")
{
SQL = SQL + " and CONCLUSION ='" + ddlCon.Text + "'";
}
//按创建时间倒序查询
SQL = SQL + "order by CREATE_TIME desc";
return SQL;
} //服务器端数据分页
private void RowDatasBind()
{
string SearchConditions = "1=1";//搜索条件
string SQLgetcount = "select count(1) from T_Aoi_TEST where 1=1"; if (!string.IsNullOrEmpty(txtWORK_ORDER_CODE.Text))
{
SearchConditions = SearchConditions + " and WORK_ORDER_CODE like''" + "%" + txtWORK_ORDER_CODE.Text.Trim() + "%" + "''";
SQLgetcount = SQLgetcount + " and WORK_ORDER_CODE like'" + "%" + txtWORK_ORDER_CODE.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtPCB_CODE.Text))
{
SearchConditions = SearchConditions + " and PCB_CODE like''" + "%" + txtPCB_CODE.Text.Trim() + "%" + "''";
SQLgetcount = SQLgetcount + " and PCB_CODE like'" + "%" + txtPCB_CODE.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtPRODUCTION_ORDER_ID.Text))
{
SearchConditions = SearchConditions + " and PRODUCTION_ORDER_ID like''" + "%" + txtPRODUCTION_ORDER_ID.Text.Trim() + "%" + "''";
SQLgetcount = SQLgetcount + " and PRODUCTION_ORDER_ID like'" + "%" + txtPRODUCTION_ORDER_ID.Text.Trim() + "%" + "'";
}
if (!string.IsNullOrEmpty(txtBeginTime.Text) && !string.IsNullOrEmpty(txtEndTime.Text))
{
SearchConditions = SearchConditions + " and CHECK_TIME>=''" + txtBeginTime.Text + "''" + " and CHECK_TIME<=''" + txtEndTime.Text + "''";
SQLgetcount = SQLgetcount + " and CHECK_TIME>='" + txtBeginTime.Text + "'" + " and CHECK_TIME<='" + txtEndTime.Text + "'";
}
if (ddlCon.Text != "9")
{
SearchConditions = SearchConditions + " and CONCLUSION =''" + ddlCon.Text + "''";
SQLgetcount = SQLgetcount + " and CONCLUSION ='" + ddlCon.Text + "'";
} int StartRow = (AspNetPager1.CurrentPageIndex * AspNetPager1.PageSize) - AspNetPager1.PageSize;//计算起始行
string SQLGetPage = "EXEC [Common_GetPageRecords] @StartRow=" + StartRow + ",@MaxRows = " + AspNetPager1.PageSize + ",@TableName = N'T_Aoi_TEST',@PrimaryKey = N'TEST_CODE',@GetFields = N'PCB_CODE,WORK_ORDER_CODE,PRODUCTION_ORDER_ID,TEST_CODE,PLANT_CODE,CREATE_TIME,DEVICE_NO,(case CONCLUSION when 0 then ''通过'' when 1 then ''不通过'' else ''其他'' end) CONCLUSION',@SearchConditions ='" + SearchConditions + "',@SortExpression = N'TEST_CODE desc'"; //计算总行数
DataSet dss = DBHelper.GetDataSetMis(SQLgetcount);
DataTable fileNameDt = dss.Tables[0];
this.AspNetPager1.RecordCount = Convert.ToInt32(fileNameDt.Rows[0][0].ToString());//总行数
//分页后数据填充
DataSet ds = DBHelper.GetDataSetMis(SQLGetPage);
PagedDataSource pds = new PagedDataSource();
pds.AllowPaging = true;//是否开启分页
pds.AllowServerPaging = true;//是否开启服务器端分页
pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex;//当前页的页码
pds.PageSize = AspNetPager1.PageSize;//每页显示的行数
int aaa = ds.DefaultViewManager.DataSet.Tables.Count;
if (ds.DefaultViewManager.DataSet.Tables.Count == 0)//修复当查询结果为空时“无法找到表 0。”的错误
{
pds.DataSource = null;
}
else
{
pds.DataSource = ds.Tables[0].DefaultView;
if (ds.Tables[0].Rows.Count != AspNetPager1.PageSize)//修复最后一页因为剩余尾数和页数不对应出现索引错误的问题
{
pds.PageSize = ds.Tables[0].Rows.Count;
}
}
this.GridView1.DataSource = pds;
this.GridView1.DataBind();
}
/// <summary>
/// 绑定数据到分页控件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
RowDatasBind();
}
/// <summary>
/// 条件查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnQuery_Click(object sender, EventArgs e)
{
RowDatasBind();
}

五、总结

到这里真假分页以及分页存储过程都已经完成了,页面加载时再也不用漫长的等待。如果你有更好方法建议欢迎吐槽、留言~

ASP.NET真分页_接前篇引用AspNetPager.dll进行数据分页的更多相关文章

  1. ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

    目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...

  2. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

  3. salesforce 零基础开发入门学习(八)数据分页简单制作

    本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能. 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的类用于VF的控制. 主要的类包括但不限于 ...

  4. OSG学习:LOD、数据分页、动态调度

    LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.在OSG的场景结点组织结 ...

  5. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  6. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  7. [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页

    一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端.在做的过程中,遇到一个问题——如何使用KnockoutJs来完成分页的功能.在前一篇文章中并没有介绍使 ...

  8. ASP.NET MVC 数据分页

    作为一个菜鸟级的程序猿,总结一下学到的两种数据分页. 1.真分页 真分页就是需要时从数据库里读出需要多的数据,利用存储过程可实现.网上的分页SQL特别多,数据库自带的一些方法也可方便的帮助分页,但是我 ...

  9. VS2010+MVC4+Spring.NET2+NHibernate4-传统三层架构-前篇

    VS2010+MVC4+Spring.NET2+NHibernate4 - 传统三层架构 - 前篇 一直追求使用开源项目,就因一个字:懒! 一直想整理一下的,却一直懒到现在!从当初用的MVC3到现在的 ...

随机推荐

  1. Python脚本:爬取天气数据并发邮件给心爱的Ta

    第一部分:爬取天气数据 # 在函数调用 get_weather(url = 'https://www.tianqi.com/foshan') 的 url中更改城市,foshan为佛山市 1 impor ...

  2. linux统计nginx日志中请求访问量命令

    Nginx 三种分配策略:轮询.权重.ip_hash(比如你登录了一个网站,登录信息已经保存到 a 机器,但当你做后续操作时的请求会到 b 机器,那么就获取不到你原来登录的信息,此时你就需要重新登录了 ...

  3. Redis挂了,流量把数据库也打挂了,怎么办?

    你好呀,我是歪歪. 是这样的,前几天有个读者给我发消息,说面试的时候遇到一个场景题: 他说他当时,一时间竟然找不到回答问题的角度,感觉自己没有回答到点子上. 我仔细想了一下,确实是感到这个问题有一丝丝 ...

  4. Blazor 路由及导航开发指南

    翻译自 Waqas Anwar 2021年4月2日的文章 <A Developer's Guide To Blazor Routing and Navigation> [1] 检查传入的请 ...

  5. PWN——ret2dl_resolve

    PWN--ret2dl_resolve ret2dl_resolve是栈溢出中,底层且高级的一种利用手段,这里特此做一篇笔记学习一下. 个人认为,要掌握这种方法,自己去写demo来多次调试分析是不二法 ...

  6. 太细了!阿里十年技术专家联合打造“最新”Jetpack强化实战手册

    前言 提到Android架构,我们首先想到的是MVC,MVP,MVVM.他们主要是针对视图和模型的.随着Android的发展,从原来的框架很少,全是自己动手撸.到现在框架越来越多,选型也越来越多,导致 ...

  7. 第4篇-JVM终于开始调用Java主类的main()方法啦

    在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...

  8. 如何用Git上传项目到GitHub

    1.登录gitHub,进入主页面,点击"+"号,建立新仓库. 2. 输入自己的仓库名,和简单的描述,根据自己设置为公开的或私有的. 我输入的是仓库名为ESMS. 勾选此选项,rea ...

  9. Ubuntu系统Root用户无法登录

    默认 系统 root 登录 图形界面,出现 登录失败.解决方法如下: 1,登录普通用户, 打开终端执行命令, 使用su root或sudo -i切换到root用户(必须) su root 按照提示输入 ...

  10. Docker运行sonarqube-(代码质量检测平台)

    sonarqube是什么 SonarQube是用于持续检查代码质量的开源平台. 可用于持续集成,持续部署流程中的代码检测环节. idea和jenkins都提供了插件配合使用. liunx推荐配置环境 ...