[小技巧]让你的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,并自动实现真分页的更多相关文章
- 发现一个小技巧:火狐浏览器对phpmyadmin支持更友好
这段时间ytkah正在迁移服务器(A→B),为了方便起见,直接用phpmyadmin导入数据库.一般我们是用navicat来操作数据库的,但是服务器A设置了权限,无法用navicat连接,只好在浏览器 ...
- Linux的95个小技巧
Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...
- mercurial的几个易用性小技巧
其实这两年,能够采用mercurial的项目我都尽量用,甚至有些上游是git的,或者需要托管到公司内gitlab上与别人协作的,我都装上hg-git.无它,只是因为mercurial易用性比git好得 ...
- MVC 基架不支持 Entity Framework 6 或更高版本 即 NuGet的几个小技巧
MVC 基架不支持 Entity Framework 6 或更高版本.有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=276833. 原因:mvc版 ...
- Android开发的那些坑和小技巧
1.android:clipToPadding 意思是控件的绘制区域是否在padding里面.默认为true.如果你设置了此属性值为false,就能实现一个在布局上事半功陪的效果.先看一个效果图. 上 ...
- Android小技巧
一.android:clipChildren属性 效果图 看到这个图时你可以先想想如果是你,你怎么实现这个效果.马上想到用RelativeLayout?NO,NO,NO,,, 实现代码 <?xm ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- iOS:小技巧(不断更新)
记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...
- 最强 Android Studio 使用小技巧和快捷键
写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...
随机推荐
- SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支
硬广:<SVN与TortoiseSVN实战>系列已经写了两篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,关于分支和标签的知识介绍可翻阅第二篇<SVN与T ...
- javascript 同步加载与异步加载
HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面 ...
- POJ 1195
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13774 Accepted: 6393 De ...
- 设计模式-代理模式(Proxy)
应用场景: 领导都有秘书,一般会代理领导的部分职能角色,处理签字.报销.开会等任务.很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在.但是领导的的确确是真实存在的. 场景说明: 代 ...
- 建立交叉编译环境(arm-linux-gcc)
linux系统内核版本:2.6.32-358.el6.x86_64(在64位系统上安装32位程序需要另外安装一些库) arm-linux-gcc版本:本文安装的是友善之臂tiny6410光盘中自带的a ...
- Windows2008下搭建NFS实现windows空间提供linux使用
我们既然是要把Windows 的硬盘给Linux使用 就需要在Windows上安装NFS网络文件系统 操作如下 1.添加角色-----文件服务---勾选网络文件服务 2.安装完成后 我们需要把这30 ...
- IIS 7.5 配置Asp+Access的几点注意的地方
环境:window2008 R2 + iis 7.51 把网站程序放在一个www文件夹里面,给这个文件夹添加everyone的用户,赋予全部读写权限,这样安全些.2 选中要配置的网站,点击页面中间“A ...
- scala学习笔记1
一.REPL scala解释器读到一个表达式,对它进行求值,将它的打印出来,接着再继续读下一个表达式.这个过程被称作 读取-打印-循环,即REPL. 从技术上讲,scala程序并不是一个解释器.实际发 ...
- (二)OJ的主要文件
OJ搭建好了后,我们要熟悉一下OJ项目下的文件及文件夹. 首先,安装好的OJ是在目录var/www/html下. html下的php文件 这些php文件都是些主要跳转页面. admin文件夹 登录管理 ...
- phpcms后台部分修改
1.后台登陆前提示信息取消及成功后提示信息取消. (1)后台登陆前提示信息取消 phpcms\modules\admin\classes\admin.class.ph ...