AspNetPager 控件实现真分页功能
来源:互联网 发布:unity3d动画模型 编辑:程序博客网 时间:2024/06/10 08:56
前言
分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一个可以分页的DataGrid和GridView控件,但其分页功能并不尽如人意,外观比较丑,是我pass它们的主要原因。而且没有办法实现导航与数据显示的分离。
这个时候AspNetPager针对ASP.NET分页控件的不足,提出了与众不同的解决asp.net中分页问题的方案,即将分页导航功能与数据显示功能完全独立开来,由用户自己控制数据的获取及显示方式,因此可以被灵活地应用于任何需要实现分页导航功能的地方,因为AspNetPager控件和数据是独立的,因此要分页的数据可以来自任何数据源。
一、分页介绍
分页功能实现从表现形式上分为两种:真分页和假分页。二者各有特色。本篇主要介绍真分页的实现,这就简单介绍一下什么是假分页。
1、假分页:
在第一次请求后,一次性从数据库中将数据全部取出来,并不全部显示。而是根据量分为几个部分,分开呈现在屏幕上。因为是一次性的数据交互动作,显然,假分页适用于数据量不大,请求次数少的查询显示动作。
2、真分页:
是按查询数据时给定的查询记录数来查多少条数据。通俗的说,要哪里取出哪里。因为取出的数据只是一部分,所以可见真分页的效率很高。假设你的数据量很大,那么就没有必要去一次性取出所有的数据。这样发出命令到web服务器,再返回数据,时间太长了,用户早就等的不乐意了。这时候就体现出真分页的优势了。下面我就以牛腩新闻发布系统为例,介绍一下AspNetPager 控件实现真分页功能(如图一)。
[图一 AspNetPager控件使用效果展示]
二、真分页原理讲解
1、需要前台提供什么数据
大家先要考虑一个事情,就是如果实现真分页的功能,需要怎样定位我们的数据?答案是一个起始记录号码和一个终止号码。就像是班主任点名字,看着全班的花名册就会说:请20号到30号的同学到黑板上做题。这里需要从前台传递到后台BLL层,DAL层,最后到数据库的存储过程中的数据就是这个20和30。
2、AspNetPager 控件的作用
上一个问题已经解决了“我们需要什么”的问题,下面就是“怎么获取”的问题,让AspNetPager干活,它也是需要数据支持的:它要知道一共有多少数据,用户想让每一页显示几条记录。这样它的第1,2,3,页的显示,响应anp_PageChanged的时候实际就是在传递行号。
3、数据库中存储过程的原理
将开始行数和截止行数作为参数传入存储过程中,它会根据ID的次序,生成一列行号,这个行号就对应了我们要取得的数据起始标记。如图二:
[图二 存储过程执行效果展示]
三、代码实现
1、首先在newsmanager.aspx中添加AspNetPager控件
控件设置代码如下:
<webdiyer:AspNetPager ID="anp" runat="server" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" OnPageChanged="anp_PageChanged" PageSize="5" PrevPageText="上一页" CustomInfoHTML="共%RecordCount%条记录,共%PageCount%页 " ShowCustomInfoSection="Left" ShowPageIndexBox="Never" CssClass="paginator" CurrentPageButtonClass="cpb" AlwaysShow="True" CustomInfoSectionWidth=""></webdiyer:AspNetPager>
2、然后在.cs中传入数据(U层),因为要多次用到数据的绑定,所以我就把代码封装成了一个函数。方便调用。
protected void Page_Load(object sender, EventArgs e) { //判断session里面是否存在管理员 if (Session["admin"] != null && Session["admin"].ToString() == "zhou") { //已登录 if (!Page.IsPostBack) { { //第一次进入该页面时 DataTable dt = new DataTable(); dt = new NewsManager().SelectAll();//选择所有新闻 anp.RecordCount = dt.Rows.Count; //记录总数 //开始绑定记录 BindNews(); } } } else { //未登录 Response.Redirect("Default.aspx"); } } #region 绑定新闻列表 /// <summary> /// Repeater控件绑定数据源 /// </summary> private void BindNews() { int startIndex = anp.StartRecordIndex; //开始记录数 int endIndex = anp.EndRecordIndex; //结束记录数 repNews.DataSource = new NewsManager().SelectByPage(startIndex, endIndex); repNews.DataBind(); } #endregion protected void anp_PageChanged(object sender, EventArgs e) { //控件的切换实现数据库的数据交互 BindNews(); }
3、调用B层
#region 分页功能实现 /// <summary> /// 分页控件传递开始页和终止页的数据 /// </summary> /// <param name="startIndex">开始数</param> /// <param name="endIndex">截止数</param> /// <returns>DataTable</returns> public DataTable SelectByPage(int startIndex, int endIndex) { return ndao.SelectByPage(startIndex, endIndex); } #endregion
4、调用D层
/// <summary> /// 分页功能的实现 /// </summary> /// <param name="startIndex">开始</param> /// <param name="endIndex">结束</param> /// <returns></returns> public DataTable SelectByPage(int startIndex, int endIndex) { DataTable dt = new DataTable(); string cmdText = "partPage"; SqlParameter[] paras = new SqlParameter[]{ new SqlParameter ("@startIndex",startIndex ), new SqlParameter ("@endIndex",endIndex ) }; dt = sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure); return dt; } #endregion
5、数据库中的存储过程的编写
USE [newssystem]GO/****** Object: StoredProcedure [dbo].[partPage] Script Date: 2014-11-30 15:38:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:周洲-- Create date: 2014-11-28-- Description: 传入开始号和结束号,查询新闻-- =============================================ALTER PROCEDURE [dbo].[partPage] @startIndex int, --查询开始记录数 @endIndex int --结束记录数 AS BEGIN with temptbl as ( SELECT ROW_NUMBER() OVER (ORDER BY id desc)AS 行号, * from news --使得记录按顺序排列,按行号查询 ) SELECT * FROM temptbl where 行号 between @startIndex and @endIndex --传入开始和结束的参数,执行查询 END
四、总结
AspNetPager作为完全免费且开放源代码的ASP.NET控件,为Web开发提供了很大的便利。我想起作品展的时候就用到了别人的控件,让我们省去了很多代码的编写。这也算是站在了巨人的肩膀上,用别人封装好的东西,给我们自己的系统增光添彩。做完了牛腩新闻发布系统为我们掀开了B/S的一个序幕,更多有意思的东西,待我边探索边分享。
0 0
- AspNetPager 控件实现真分页功能
- VS-利用AspNetPager控件实现真分页
- 用Gridview和AspNetPager控件实现真分页(一)
- 用Gridview和AspNetPager控件实现真分页(二)
- ASP.NET使用AspNetPager控件实现真分页
- ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
- AspNetPager实现真分页+多种样式
- AspNetPager实现真分页+多种样式
- .NET实现Repeater控件+AspNetPager控件分页
- .NET实现Repeater控件+AspNetPager控件分页
- .NET基于分页控件实现真分页功能
- .NET基于分页控件实现真分页功能
- Aspnetpager+GridView+oracle实现分页功能
- aspnetpager+repeater+oracle实现分页功能
- AspNetPager+Repeater+SoCanCode实现分页功能
- 怎样通过AspNetPager实现分页功能
- 使用AspNetPager控件实现GridView分页
- AspNetPager控件实现网页分页显示
- LeetCode Search in Rotated Sorted Array
- 面向对象的六大原则
- Bzoj-1096
- IOS:iscroll里的元素对click/tap事件不响应
- 医疗时鲜资讯:移动医疗 or 互联网医疗 or 远程医疗?
- AspNetPager 控件实现真分页功能
- 内存代管理器TenuredGeneration的对象内存分配
- 阶乘的精确值
- 子串问题
- 无线开发的积累
- android 反编译
- 《c++ primer》 第8章 IO库 学习笔记
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h
- 兔子--The constructor AlertDialog.Builder(new View.OnClickListener(){}) is undefined