上一篇:打造通用ASP.NET数据分页控件(1) >>
打造通用ASP.NET数据分页控件(2)
当表现控件触发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);
}
下一篇:打造通用ASP.NET数据分页控件(3) >>
相关文章:
- · 在ASP.NET中实现会话状态基础(2)
- · 在ASP.NET中实现会话状态基础(3)
- · 在ASP.NET中实现会话状态基础(4)
- · Asp.net入门之吸星大法
- · 在ASP.NET 2.0中实现本地化(1)
- · 在ASP.NET 2.0中实现本地化(2)
- · WebMatrix开发ASP.NET试用手记(1)
- · WebMatrix开发ASP.NET试用手记(2)
- · WebMatrix开发ASP.NET试用手记(3)
- · 表单填写时用回车代替TAB的实现方式
- · ASP使用MYSQL数据库全攻略
- · 友情连接浏览器
- · 方便购买的电子商务站点设计技巧
- · 使用ActiveX控件开发网页常见的问题
- · 基于ACCESS数据库的纯asp论坛制作心得
- · 关于打印页面的一些经验
- · vbscript和javascript互相调用
- · 使用索引服务器 - 增加属性
- · 使用索引服务器 - 创建ASP页面
- · 使用索引服务器- 使用索引服务器的对象
- · 已调试好的asp程序在VB中转换为组件的技巧
- · ASP.NET HTTP运行时组成详解(1)
- · 实现类似Windows资源管理器的DataGrid(2)
- · ASP.NET HTTP运行时组成详解(2)
- · ASP.NET HTTP运行时组成详解(3)
- · ASP.NET HTTP运行时组成详解(4)
- · ASP.NET HTTP运行时组成详解(5)
- · ASP.NET中使用TreeView控件(1)
- · ASP.NET中使用TreeView控件(3)
- · ASP.NET中使用TreeView控件(2)
- · ASP.NET中使用TreeView控件(4)
- · ASP.NET服务器控件发送脚本(1)
- · ASP.NET服务器控件发送脚本(2)
- · ASP.NET服务器控件发送脚本(3)
- · ASP.NET服务器控件发送脚本(4)
- · ASP.NET+XML打造网络硬盘(1)
- · ASP.NET+XML打造网络硬盘 (3)
- · ASP导出Excel数据的四种方法(2)
