[小技巧]让你的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 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...
随机推荐
- SWFUpload使用指南
SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...
- hbase blocksize设置,与hdfs关系
关于如何设定数据块的大小,我们应用一段HFile源码中的注释: 我们推荐将数据块的大小设置为8KB至1MB.大的数据块比较适合顺序的查询(比如Scan),但不适合随机查询,想想看,每一次随机查询可能都 ...
- windows server 备份与还原
1:文件备份: ①Goodsync ②Acronis Backup & Recovery 2:域控&系统备份 ①CMD -- >NTbackup (不支持异机还原) ②Acron ...
- 很不错的安卓FadingActionBar控件源码
这个我刚刚从一个github下载过来的,自己测试一下运行了,感觉还不错的,安卓FadingActionBar控件源码,现在就给大家分享一下,源码我已经上传到源码天堂那里了,想下载的朋友可以去那里下载吧 ...
- c++强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
static_cast <typeid>(exdlvssion) static_cast 很像 C 语言中的旧式类型转换.它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户 ...
- java编程思想第四版中 net.mindview.util包
操作系统: win8.1 编译环境 JDK1.6 编辑器 notepad++ 第48页练习8 1 下载相应程序包 Thinking in Java 4ed - CODE 2 设置相应的CLASSPAT ...
- libharu 源码编译 VS2010
最近项目中接过了一个libharu PDF 开源库的锅,哈哈.于是就自己编译了一套libharu 的MFC下的静态库和动态库. 编译libharu需要用到zlib库和libpng库,libpng库又依 ...
- 如何利用CSS代码使图片和文字在同一行显示且对齐
对于初学css的新手朋友来说,经常会遇到这样一个问题,当文字和图片出现在同一行或者同一个div里面的时候,在浏览器中运行出来的显示效果往往是在不同的行,那么,我们怎么才能利用CSS代码使图片和文字在同 ...
- 【项目相关】MVC中使用WebUploader进行图片预览上传以及编辑
项目中需要用到多图片上传功能,于是在百度搜了一下,首先使用了kissy uploader,是由阿里前端工程师们发起创建的一个开源 JS 框架中的一个上传组件...但,后面问题出现了. 在对添加的信息进 ...
- 在PeopleSoft系统中实现打印页面的功能
我们知道,在PeopleSoft HCM里,一般上了薪酬模块的话,都会客户化工资单页面,去匹配公司之前的工资单的报表的格式.有的时候,这个工资单页面又需要打印出来,以供员工的使用.PeopleSoft ...