打造通用ASP.NET数据分页控件(4)
作者:东方欲晓 来源:yesky 发布时间:2007-08-18 13:27:00
标签:ASP.NET,分页
在分页控件中,寻找适当Builder类的操作由一个类型安全的集合完成。
public class AdapterCollection:DictionaryBase
{
private string GetKey(Type key)
{
return key.FullName;
}
public AdapterCollection() {}
publicvoid Add(Type key,AdapterBuilder value)
{
Dictionary.Add(GetKey(key),value);
}
publicbool Contains(Type key)
{
return Dictionary.Contains(GetKey(key));
}
publicvoid Remove(Type key)
{
Dictionary.Remove(GetKey(key));
}
public AdapterBuilder this[Type key]
{
get{return (AdapterBuilder)Dictionary[GetKey(key)];}
set{Dictionary[GetKey(key)]=value;}
}
}
AdapterCollection依赖于DataSource类型,DataSource通过BoundControl_DataBound巧妙地引入。这里使用的索引键是Type.FullName方法,确保了每一种类型索引键的唯一性,同时这也把保证每一种类型只有一个Builder的责任赋予了AdapterCollection。将Builder查找加入BoundControl_DataBound方法,结果如下:
public AdapterCollection Adapters
{
get{return _adapters;}
}
private bool HasParentControlCalledDataBinding
{
get{return _builder != null;}
}
private void BoundControl_DataBound(object sender,System.EventArgs e)
{
if (HasParentControlCalledDataBinding) return;
Type type = sender.GetType();
_datasource = type.GetProperty("DataSource");
if (_datasource == null)
throw new NotSupportedException("分页控件要求表现控件必需包含一个DataSource。");
object data = _datasource.GetGetMethod().Invoke(sender,null);
_builder = Adapters[data.GetType()];
if (_builder == null)
throw new NullReferenceException("没有安装适当的适配器来处理下面的数据源类型:"+data.GetType());
_builder.Source = data;
ApplyDataSensitivityRules();
BindParent();
RaiseEvent(DataUpdate,this);
}
BoundControl_DataBound方法利用HasParentControlCalledDataBinding检查是否已经创建了Builder,如果是,则不再执行寻找适当Builder的操作。Adapters表的初始化在构造函数中完成:
public Pager()
{
SelectedPager=new System.Web.UI.WebControls.Style();
UnselectedPager = new System.Web.UI.WebControls.Style();
_adapters = new AdapterCollection();
_adapters.Add(typeof(DataTable),new DataTableAdapterBuilder());
_adapters.Add(typeof(DataView),new DataViewAdapterBuilder());
}
最后一个要实现的方法是BindParent,用来处理和返回数据。
private void BindParent()
{
_datasource.GetSetMethod().Invoke(BoundControl,
new object[]{_builder.Adapter.GetPagedData(StartRow,ResultsToShow*CurrentPage)});
}
这个方法很简单,因为数据处理实际上是由Adapter完成的。这一过程结束后,我们还要用一次Reflection API,不过这一次是设置表现控件的DataSource属性。


猜你喜欢
- //如果之前有选中的,则把选中radio取消掉$("#tj_cat .pro_category").each(funct
- 问题:将文件夹a下任意命名的10个文件修改为如下图所示文件?代码:#coding:utf-8import ospath = "./
- 用关键字 in 和not in 来 如下:qwe =[1,2,3,4,5] if 2 in qwe: print ‘good!' e
- 一.docx模块Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把
- 一般在Django的视图函数中使用request.POST来获取请求体,request.POST是QueryDict类,通常作为dict来使
- jqueryjQueryJQUERYJqueryJQueryjquery报错jsJSJsmyeclipseMyEclipseMyeclips
- 1、简介Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。
- 需求:爬取搜狗首页的页面数据import requests# 1.指定urlurl = 'https://www.sogou.com
- 如下所示:a = [0, 1, 2, 3, 4, 0, 2, 3, 6, 7, 5]selected = [x for x in a if
- 在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,M
- PEP 3107引入了功能注释的语法,PEP 484 加入了类型检查标准库 typing 为类型提示指定的运行时提供支持。示例:def f(
- 前言在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些
- 如下所示:list=[1,2,3,4,5,6,7,8,9,0,11,0,13,14,15,16,17,18,19,20]#把list分为长度
- 01 Go中的泛型是什么众所周知,Go是一门静态类型的语言。静态类型也就意味着在使用Go语言编程时,所有的变量、函数参数都需要指定具体的类型
- 最近很多小伙伴在尝鲜chatGPT,使用中遇到网站的1020的错误码,博主也遇到了相似的问题,不同的人运行环境不一样,可能解决方案不一样,接
- pymysql写入中文直接写入中文会出现错误。根据网上的方法,设置my.ini不成功sql = "INSERT INTO comp
- 如果有人问你,GET和POST,有什么区别?你会如何回答?真实案例 前几天有人问我这个问题。
- ThinkPHP的分组功能是广为开发者使用的一个具有很大实用价值的功能,该功能可以解决中大型项目情况中MVC分层文件过多导致不易管理的问题。
- 利用sklearn画出决策树并保存为PDF下载Graphviz进入官网下载并安装:https://graphviz.gitlab.io/_p
- 用到的 Pygame 函数贪吃蛇小游戏用到的函数 功能描述init()初始化 pygamedisplay.set_mode()以元