DataGrid实现逻辑分页
在ASP.NET内建提供的所有数据排列控件中,只有DataGrid数据控件是提供数据分页功能的。DataReapter数据控件只能提供一些简单 的、基础的数据重复排列功能,对于一些比较复杂的应用是无能为 力的;而DataList数据控件设计的目的在于按照固定的格式列出不同数据项,也不提供数据分页,但是,如果真的需要在DataList控件中实现分页 数据导航,需要编写的代码其实也是很少的。
DataGrid数据控件作为Asp.NET中唯一可以实现数据分页的控件(使
用内建属性),它提供数据分页的两种方式,这两种数据分页实现方式的不同在于他们取得数据的内容。在使用DataGrid默认的数据分页方式的时候,我们
首先必须提供一个包含需要显示的所有数据的DataSet,然后,DataGrid根据每页页面数据量来显示的数据,使用这种数据分页方式的优点是显然
的,程序代码使用很少,而缺点就是当数据量较大的时候,这种方式是效率很低的;在使用定制分页方式的情况下,DataGrid只取得当前页需要显示的数据
量,而不是默认分页方式的所有页面数据量,这种方式的分页,其效率无疑高的多。这两种分页方式是否可以满足我们在实际开发中的所有需求呢,当然是不可能
了。然而,使用定制数据分页功能,我们可以开发出完全符合我们应用开发要求的数据分页引擎。
从以上介绍可
知,DataGrid的数据分页是没有逻辑意义的,完全是按照机械的数据量来分页,每一页的数据量是完全一样的。在本文中,我们将演示使用
DataGrid的定制分页功能来实现具有逻辑意义的分页,这样,每页的数据量就不再完全相同,而是根据数据具体情况来决定具体每页的数据量。
一、逻辑数据分页基础
在DataGrid控件中,如果按照默认的方式,每页数据量是一定的,设计者通过PageSize来设置每页需要显示的数据量,当用户点击标示数据页面
的数字的时候,DataGrid就取得该页面数据进行显示。使用定制分页的时候,DataGrid也需要通过VirtualItemCount控件来知道
当页需要显示的数据量。
一般的,用户可以选择不同DataGrid数据页面来查看自己所需要的数据,然而,我们稍微想像一下,当数据量比较大的时候,页面数量也会很多,我们将呈现给用户的是怎样的一个界面呢?
这种情况下,逻辑数据分页会怎样处理呢?假设我们需要查看某个年度公司订单的信息,比如,在SQL 2000
Server中,我们可以查询NorthWind示例数据库来查看一个年度的订单信息,这样,我们会得到几百条信息,使用DataGrid的默认分页似乎
完全可以达到要求,然而,当这些数据显示给用户的时候,他们会真的喜欢翻阅几乎整个年度的信息吗?当我们要告诉用户某个月份的信息的时候,难道告诉他们数
据在15到16页之间吗?显然,这种方式是很不友好的,有没有其他更加符合我们一般思维的分页方式呢?那就是完全按照月份来分页。在这样的分页中,页面数
量是固定的,而每页数据量是不固定的,和DataGrid默认的分页方式刚好相反。
二、逻辑数据分页的实现
在以下的举例中,我们使用SQL 2000 Server的NorthWind数据库作为试验数据库,取该数据库某一个年度的数据作为试验数据。具体代码如下:
FROM orders AS o
INNER JOIN customers AS c ON o.customerid=c.customerid
WHERE Year(orderdate)=@TheYear
然后定义一个DataGRid,该DataGrid设置了AllowPaging和AllowCustomPaging都为True,这样允许DataGrid进行数据分页:
AllowPaging="True"
AllowCustomPaging="True"
PageSize="100"
OnItemCreated="ItemCreated"
OnPageIndexChanged="PageIndexChanged">
<PagerStyle Position="top" Mode="NumericPages"
PageButtonCount="12" />
<columns>
:
</columns>
</asp:datagrid>
我
们在举例中要求每页显示的数据量是不同的,但是,即使是使用定制分页,也需要设置每页显示的具体数据量,也就是说,无论DataGrid取得的数据是多
少,我们都必须设置PageSize属性,但是这里我们每页的数据量是不等的,这样就要求我们估计每页最大数据量,在程序中使用100。因为我们需要显示
一年的数据,所以,程序中我们要设置12个页面,也就是12个链接,这样,就需要设置属性VirtualItemCount为12×100也就是
1200。另外,默认的,DataGrid显示的页面数最大是10,为了显示12也月份的数据,我们需要设置PageButtonCount属性为12。
我们先来看程序具体运行图示:

在以上的图片中,我们可以看到,每个链接对应一个月份的数据,它的具体实现方法如下:
FROM orders AS o
INNER JOIN customers AS c ON o.customerid=c.customerid
WHERE Year(orderdate)=@TheYear
AND Month(orderdate)=@ThePageIndex
这样,根据用户选择的年份和数据页面,就可以确定需要显示的数据。很简单的,我们按照这个方法也可以做到按照子母分页的功能,这对于按照名字显示信息是非常有用的。
三、数据页面栏
无疑,上面的数据分页已经基本达到我们的要求,然而,我们可以使其更加具有吸引力,那就是将以上表示月份的数字改为具体的月份名称,为了做到这一点,我们实现需要捕捉DataGrid的ItemCreated事件:
DataGridItemEventArgs e)
{
ListItemType lit = e.Item.ItemType;
if (lit == ListItemType.Pager)
{...}
}
然后,将表示月份的数字替换为月份的名字,为了区分当前显示月份和其他月份,使用Label来显示当前月份,不可点击,使用LinkButton来表示其他月份,可以点击选择。
for(int i=0; i<pager.Controls.Count; i+=2)
{
Object o = pager.Controls[i];
if (o is LinkButton)
{
LinkButton lb = (LinkButton) o;
DateTime dt = new DateTime(2002,
Convert.ToInt32(lb.Text), 1);
lb.Text = dt.ToString("MMM");
}
}
以上效果如图(图二):

四、数据页面栏外观设置
上图我们看到,数据页面栏已经实现了月份表示,但是,它的效果非常漂亮,怎样实现呢?
首先,需要设置以下样式:
<ItemStyle BackColor="White" height="16px" />
然后设置Link的样式如下:
lb.BorderWidth = 1;
lb.BorderColor = Color.White;
lb.BorderStyle = BorderStyle.Outset;
lb.BackColor = Color.LightYellow;
为了Label有类似3D的选项页效果,这样设置:
l.BorderWidth = 1;
l.Style["border-top"] = "SkyBlue outset 1px";
l.Style["border-left"] = "SkyBlue outset 1px";
l.Style["border-right"] = "SkyBlue outset 1px";
l.Style["border-bottom-color"] = "SkyBlue";
这样设置以后,数据分页栏就会比较有图示的效果,比较友好。
DataGrid实现逻辑分页的更多相关文章
- easyui datagrid 逻辑分页
function getGroupUsers(groupPath) { $('#tbGroupUsersList').datagrid({ width: 800, height: 100, nowra ...
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- JQuery easyUI DataGrid 创建复杂列表头(译)
» Create column groups in DataGrid The easyui DataGrid has ability to group columns, as the followin ...
- ASP.NET Aries DataGrid 配置表头说明文档
DataGrid 配置表头 字段 中文 说明 Field 字段 注意:mg_ 开头的字段为层级表头 Title 列称 OrderNum 序号 显示的顺序(冻结和非冻结列是两个组的序号) Width 列 ...
- ASP.NET Aries JSAPI 文档说明:AR.DataGrid、AR.Dictionary
AR.Global 文档 1:对象或属性: 名称 类型 说明 DG 对象 DataGrid操作对象 //datagrid集合,根据ID取出DataGrid对象,将Json当数组用. Items: ne ...
- ASP.NET Aries JSAPI 文档说明:AR.DataGrid
AR.DataGrid 文档 用法: <body> <table id="dg"></table> </body> </htm ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
系列目录 本节知识点 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI读取MVC后台Json数据 开始实现 我们的系统似乎越来越有趣了 首先从前端入手,开打View下面的Sh ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实 ...
- 控制EasyUI DataGrid高度
这次要说的是控制EasyUI的高度,平时我公司的项目,用EasyUI较多,然后datagrid这个组件是用的非常多的.平时我们都是固定高度,常见代码如下: <table ...
随机推荐
- Viewport解决分辨率适配问题
Viewport : 字面意思为视图窗口,在移动 web 开发中使用.表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动 web 站点跨设备显示效果基本一致. 基本写法: &l ...
- Visual Studio Code 1.0.1 for python
1. 安 F1健 ext install python E:\test\.vscode下的三个文件 2.launch.json { "version": "0.1.0&q ...
- C# 中传递多个参数给多线程
1.方式一:使用ParameterizedThreadStart委托 如果使用了ParameterizedThreadStart委托,线程的入口必须有一个object类型的参数,且返回类型为void. ...
- OpenResty(nginx扩展)实现防cc攻击
OpenResty(nginx扩展)实现防cc攻击 导读 OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强 ...
- jQuery刷新div内容,并对刷新后元素绑定事件。$(document).on()
给id=zt的元素绑定点击事件 点击刷新id=ps_list中类容(内容中含有id=zt元素) 把zt的点击事件委托到了document上,这样就不用考虑事件是否能绑定到新加元素上 代码如下: $(d ...
- maven-使用assembly自定义打包
用maven管理项目引用依赖很方便,但是打包的时候如果是web包还好,会直接把依赖的jar包打到lib目录中,如果是jar包的话,依赖默认是不打入进去的 这样如果运行环境中没有依赖的jar包,就麻烦了 ...
- C#使用Monitor类、Lock和Mutex类进行多线程同步
在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁, ...
- (转)乐观的并发策略——基于CAS的自旋
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...
- IOS 弹出菜单的动态效果
效果1.点击按钮上浮 2.点击按钮下沉 3.点击按钮下拉展示 4.点击按钮向上收缩 5.左右如是说 关键是改变视图的大小位置的时机正确与否 eg1.1.点击按钮下沉消失 已知myView.frame= ...
- iOS UIwebView html 字符串转换
解析json字段是一段html串,平常解析出来都能在uiwebview上正常显示,这却出现以下状况,文本内容夹杂好多不需要显示的字符,例如: NSString*string =@"<s ...