[小技巧]让你的GridView支持IQueryable,并自动实现真分页
众所周知,asp.net自带的GridView在自带分页方面设计得很2,因为它是假分页,即内存分页。而且它不智能支持强大的Iqueryable。
但这表明微软忽略了现实中的分页需求吗?答案应该不是,我想也不是。
那么,通过什么方式可以达到真分页的效果呢?使用Asp.Net自带的3种DataSource(objectdatasource, entitydatasource, linqdatasource)。 三种datasource各有所长。
但这样做还是有些麻烦呀……
朋友有一个项目,之前数据少,没有考虑过假分页带来的隐患,现在项目也做大了,数据也大了,问题也出来了,怎么办可以实现最少改动呢?废话不多说,直接上代码:
1 自定义一个PageGridView
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Reflection; namespace DGVTest { public class PagingGridView : GridView { public PagingGridView() { } private IQueryable querableData; public override Object DataSource { get { return base.DataSource; } set { if (value is IQueryable) { querableData = (IQueryable)value; ObjectDataSource ods = new ObjectDataSource(); ods.ID = "ods_" + this.ID; ods.EnablePaging = this.AllowPaging; // This must be the full name of the class ods.TypeName = "DGVTest.IQueryableAdapter"; ods.SelectMethod = "GetData"; ods.SelectCountMethod = "GetCount"; ods.StartRowIndexParameterName = "startRowIndex"; ods.MaximumRowsParameterName = "pageSize"; ods.EnableViewState = false; ods.ObjectCreating += (o,e)=> e.ObjectInstance = new IQueryableAdapter(querableData); base.DataSource = ods; if (AllowPaging) { PageIndexChanging += (o, gpe) => { PageIndex = gpe.NewPageIndex; DataBind(); }; } if (AllowSorting) { //---if want to implement sorting... } } else { base.DataSource = value; } } } } public class IQueryableAdapter { private IQueryable _data; private int _totalCount; public IQueryableAdapter(IQueryable data) { _data = data; _totalCount = (int)GetExtMethod("Count", _data ).Invoke(null, new object[] { _data }); } public object GetData() { return _data; } public int GetCount() { return _totalCount; } public object GetData(int startRowIndex, int pageSize) { var enumResult = GetExtMethod("Skip", _data).Invoke(null, new object[] { _data, startRowIndex }); return GetExtMethod("Take", _data ).Invoke(null, new object[] { enumResult, pageSize }); } private MethodInfo GetExtMethod(string methodName,object obj ) { var genType = obj.GetType().GetGenericArguments()[0]; return typeof(System.Linq.Queryable) .GetMethods(BindingFlags.Public | BindingFlags.Static) .First(m => m.Name == methodName) .MakeGenericMethod(genType); } } }
2 把这个新的GridView引入原项目
一般的做法是在页面上添加引用符:
<%@ Register Assembly="DGVTest" Namespace="DGVTest" TagPrefix="juyee" %>
然后把原GridView的前缀改了:
<juyee:PagingGridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"></juyee:PagingGridView>
但每个页面都加引用命令,还是很麻烦的。这可以通过在config解决:
<system.web> <pages> <controls> <add tagPrefix="juyee" namespace="DGVTest" assembly="DGVTest" /> </controls> </pages> </system.web>
有了这个,就不用每个页面加引用命令啦。至于替换gridview的声明嘛,可以用ctrl+F。
3 Code-Behind
现在可以直接把IQueryable类型的对象做为新View的数据源啦。值得一提的是,一定要orderby一下哟,不然执行IQueryable.Skip时会报错。
var ds= from t in new testdbEntities().People orderby t.Name select t; GridView1.DataSource =ds; GridView1.DataBind();
至此问题解决~赶快试试吧。
[小技巧]让你的GridView支持IQueryable,并自动实现真分页的更多相关文章
- Linux的95个小技巧
Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...
- Android开发的那些坑和小技巧
1.android:clipToPadding 意思是控件的绘制区域是否在padding里面.默认为true.如果你设置了此属性值为false,就能实现一个在布局上事半功陪的效果.先看一个效果图. 上 ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- 最强 Android Studio 使用小技巧和快捷键
写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- Windows Azure一些小技巧集合
我最近做了一个Windows Azure上面的项目,自己在做的过程中遇到了很多问题.有的是我自己摸索解决,有的是到网上寻找零碎的信息结合起来解决的.我感觉应当把某些解决方法集中一下,方便我以后查阅,也 ...
- FineUI小技巧(7)多表头表格导出
前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ...
- FineUI小技巧(5)向子窗口传值,向父窗口传值
前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值 ...
- YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧
最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...
随机推荐
- enote笔记语言(1)
what 是什么 why 为什么 when 何时 where 在哪里 whi ...
- java 过滤器Filter
一.首先在web.xml里进行拦截过滤 <filter> <filter-name>platformServiceAgreementFilter</filt ...
- 【Oracle】去除表中重复的数据
删除表重复数据 (t1表中有重复数据)1.使用distinct create table t2 as select * from t1;create table tmp_t2 as select di ...
- C# 方法的回调(上)
在C#编程中方法的回调有以下几种方式 通过接口.通过委托.定时回调.多线程回调,异步回调 下面就以代码的形式来讲解这种方式 通过接口回调 代码示例如下 定义接口,定义了一个Run 方法: interf ...
- java类
1.四种访问控制符 private.不指明.protected.public 2.构造函数没有返回值 是因为构造函数默认返回的是类的实例对象.所以不需要写返回值 3.static static表示类拥 ...
- jQuery Mobile 工具栏
jQuery Mobile 工具栏 工具栏元素常被放置于页眉和页脚中 - 以实现"已访问"的导航: 标题栏 页眉通常会包含页眉标题/LOGO 或一到两个按钮(通常是首页.选项或搜索 ...
- input 默认值为灰色,输入时清楚默认值
input 默认值为灰色,输入时清楚默认值 <input value="please input your name" onFocus="if(value==def ...
- JWPlayer中字幕文件的配置
最近应项目要求研究JWPlayer,视研究进度可能会将解决的问题或者一些配置方法写在这里. jwplayer支持vtt和srt格式的字幕文件,在视频中可以选择加载多个字幕文件(常用于多语言字幕),并且 ...
- 第一个Sprint冲刺第六天
讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:解决编写代码的问题 讨论地点:宿舍 进展:已开始对代码的编写
- 使用ajax技术无刷新动态调用股票信息
新浪的财金频道一直感觉做得很好.但由于最近网速慢的缘故,查看股票信息时网页老是打不开.这几天一直在研究ajax,于是用jquery自己做了一个自动读取新浪股票实时数据的页面. <html> ...