首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统
一个相当独立的.通用分页控件c#源码二-.NET教程,C#语言
作者:网友供稿 点击:57
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
二、核心功能

  当表现控件触发databinding事件,分页控件就可以获取datasource属性。遗憾的是,微软没有提供所 有数据绑定类实现的接口,诸如idatasourceprovider之类,而且并非所有从control或webcontrol类继承的控件都有一个 datasource属性,因此向上定型成control类没有意义,唯一可行的办法是通过reflection api直接操作datasoruce属性。在讨论事件句柄方法之前,应该指出的是,为了注册事件句柄,首先必须获得一个表现控件的引用。分页控件显露了一 个简单的字符串属性bindtocontrol:

public string bindtocontrol
{
get
{
if (_bindcontrol == null)
throw new nullreferenceexception("在使用分页控件之前,请先通过设置bindtocontrol属性绑定到一个控件。");
return _bindcontrol;}
set{_bindcontrol=value;}
}

   这个方法非常重要,所以最好能够抛出一个含义更明确的信息,而不是抛出标准的nullreferenceexception异常。在分页控件的 oninit方法中,我们解析了对表现控件的引用。本例应当用oninit事件句柄(而不是构造函数)来确保jit编译的aspx页面已经设置了 bindtocontrol。

protected override void oninit(eventargs e)
{
_boundcontrol = parent.findcontrol(bindtocontrol);
boundcontrol.databinding += new eventhandler(boundcontrol_databound);
base.oninit(e);
...
}

   搜索表现控件的操作通过搜索分页控件的parent控件完成,在这里,parent就是页面本身。按照这种方式使用parent比较危险,举例来说,如 果分页控件嵌入到了另一个控件之中,例如嵌入到了table控件之中,则parent引用实际上将是一个对table控件的引用。由于 findcontrol方法只搜索当前的控件集合,除非表现控件就在该集合之中,否则不可能搜索到。一种比较安全的方法是递归地搜索各个控件集合,直至找 到目标控件为止。
  找到boundcontrol之后,我们将分页控件注册成为databinding事件的监听器。由于分页控件要操作数 据源,所以该事件句柄应当是调用链中的最后一个,这一点很重要。不过,只要表现控件在oninit事件句柄中注册databinding的事件句柄(默认 行为),分页控件操作数据源时就不会出现问题。

  databound事件句柄负责获取表现控件的datasource属性。

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);
}
   在databound中,我们尝试通过reflection api获得datasource属性,然后返回实际数据源的一个引用。现在虽然已经获知了数据源,但分页控件还必须知道如何操作该数据源。为了让分页控件 不依赖于特定的表现控件,问题复杂了很多。不过,如果让分页控件依赖于特定的数据源,那就背离了设计一个灵活的分页控件的目标。我们要通过一个接插式的体 系结构来确保分页控件能够处理各种数据源,无论是.net提供的数据源,还是自定义的数据源。

  为了提供一个健壮的、可伸缩的接插式体系结构,我们将利用[gof] builder模式构造出一个解决方案。





idatasourceadapter接口定义了分页控件操作数据所需的最基本的元素,相当于“插头”。

publicinterface idatasourceadapter
{
int totalcount{get;}
object getpageddata(int start,int end);
}

   totalcount属性返回在处理数据之前数据源所包含元素的总数,而getpageddata方法返回原始数据的一个子集,例如:假设数据源是一个 包含20个元素的数组,分页控件将数据显示成每页10个元素,则第一页的元素子集是数组元素0-9,第二页的元素子集是数组元素10-19。 dataviewadapter提供了一个dataview类型的插头:

internal class dataviewadapter:idatasourceadapter
{
private dataview _view;

internal dataviewadapter(dataview view)
{
_view = view;
}
public int totalcount
{
get{return (_view == null) ? 0 : _view.table.rows.count;}
}
public object getpageddata(int start, int end)
{
datatable table = _view.table.clone();

for (int i = start;i<=end && i<= totalcount;i++)
{
table.importrow(_view[i-1].row);
}
return table;
}
}

   dataviewadapter实现了idatasourceadapter的getpageddata方法,该getpageddata克隆原始的 datatable,将原始datatable中的数据导入到新的datatable。该类的可见性有意地设置成internal,目的是为了向web开 发者隐藏实现细节,进而通过builder类提供一个更简单的接口。

public abstract class adapterbuilder
{
private object _source;

private void checkfornull()
{
if (_source == null) throw new nullreferenceexception("必须提供一个合法的数据源");
}
public virtual object source
{
get
{
checkfornull();
return _source;}
set
{
_source = value;
checkfornull();
}
}
public abstract idatasourceadapter adapter{get;}
}

   adapterbuilder抽象类为idatasourceadapter类型提供了一个更容易管理的接口,由于提高了抽象程度,我们不必再直接使用 idatasourceadapter,同时adapterbuilder还提供了在分页数据之前执行预处理的指令。另外,该builder还使得实际的 实现类,例如dataviewadapter,对分页控件的用户透明:

public class datatableadapterbuilder:adapterbuilder
{
private dataviewadapter _adapter;

private dataviewadapter viewadapter
{
get
{
if (_adapter == null)
{
datatable table = (datatable)source;
_adapter = new dataviewadapter(table.defaultview);
}
return _adapter;
}
}
public override idatasourceadapter adapter
{
get
{
return viewadapter;
}
}
}
public class dataviewadapterbuilder:adapterbuilder
{
private dataviewadapter _adapter;

private dataviewadapter viewadapter
{
get
{ // 延迟实例化
if (_adapter == null)
{
_adapter = new dataviewadapter((dataview)source);
}
return _adapter;
}
}
public override idatasourceadapter adapter
{
get{return viewadapter;}
}
}


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·在.Net中嵌入资源文件到程序集中-.NET教程,VB.Net语言
·字符串转换成十六进制-.NET教程,算法/线程
·获得网卡MAC地址和IP地址(VB.net)-.NET教程,VB.Net语言
·.Net框架程序设计(一)----进阶-.NET教程,.NET Framework
·我是否可以将Excel数据导入?-ASP教程,数据库相关
·封面的最佳设计-.NET教程,评论及其它
·使用C#控制远程计算机的服务-.NET教程,C#语言
·利用XMLHTTP下载文件-ASP教程,XML相关
·关于VB.net中无法使用VB6控件-.NET教程,VB.Net语言
·.NET里面的Interop太烂了-.NET教程,.NET Framework
最新文章
·windowsxp sp3 概览里面到底有什么?_windows xp
·让vista系统停止讨厌的报告程序问题_windows vista
·如果你有100万流量如何赚钱_网赚技巧
·携程海归派ceo梁建章:天才整合旅游业_站长访谈
·狂热+坚持=成功 博客园ceo dudu访谈_站长访谈
·php5对mysql5的任意数据库表的管理代码示例(三) _php技巧
·php5对mysql5的任意数据库表的管理代码示例(一)_php技巧
·好的产品才是最好的推广_站长心得
·视频网站的媒体传播现状走向_站长心得
·点评一下目前国内各站长类网站发展现状_站长心得
相关主题
  • 一个相当独立的.通用分页控件c#源码四-.NET教程,C#语言
  • 一个相当独立的.通用分页控件c#源码三-.NET教程,C#语言
  • 一个相当独立的.通用分页控件c#源码一-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭