C#DataSource属性浅析

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

创新互联公司主营大埔网站建设的网络公司,主营网站建设方案,成都App制作,大埔h5小程序设计搭建,大埔网站营销推广欢迎大埔等地区企业咨询

 
 
 
  1. public string BindToControl
  2. ...{
  3. get
  4. ...{
  5. if (_bindcontrol == null)
  6. throw new NullReferenceException
    ("在使用分页控件之前,请先通过设置BindToControl属性绑定到一个控件。");
  7. return _bindcontrol;}
  8. set...{_bindcontrol=value;}

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

 
 
 
  1. protected override void OnInit(EventArgs e)
  2. ...{
  3. _boundcontrol = Parent.FindControl(BindToControl);
  4. BoundControl.DataBinding += new EventHandler(BoundControl_DataBound);
  5. base.OnInit(E);
  6. ...

搜索表现控件的操作通过搜索分页控件的Parent控件完成,在这里,Parent就是页面本身。按照这种方式使用Parent比较危险,举例来说,如果分页控件嵌入到了另一个控件之中,例如嵌入到了Table控件之中,则Parent引用实际上将是一个对Table控件的引用。由于 FindControl方法只搜索当前的控件集合,除非表现控件就在该集合之中,否则不可能搜索到。一种比较安全的方法是递归地搜索各个控件集合,直至找 到目标控件为止。

找到BoundControl之后,我们将分页控件注册成为DataBinding事件的监听器。由于分页控件要操作数 据源,所以该事件句柄应当是调用链中的最后一个,这一点很重要。不过,只要表现控件在OnInit事件句柄中注册DataBinding的事件句柄(默认 行为),分页控件操作数据源时就不会出现问题。

DataBound事件句柄负责获取表现控件的C# DataSource属性。

 
 
 
  1. private void BoundControl_DataBound(object sender,System.EventArgs e)
  2. ...{
  3. if (HasParentControlCalledDataBinding) return;
  4. Type type = sender.GetType();
  5. _datasource = type.GetProperty("DataSource");
  6. if (_datasource == null)
  7. throw new NotSupportedException("分页控件要求表现控件必需包含一个DataSource。");
  8. object data = _datasource.GetGetMethod().Invoke(sender,null);
  9. _builder = Adapters[data.GetType()];
  10. if (_builder == null)
  11. throw new NullReferenceException
    ("没有安装适当的适配器来处理下面的数据源类型:"+data.GetType());
  12. _builder.Source = data;
  13. ApplyDataSensitivityRules();
  14. BindParent();
  15. RaiseEvent(DataUpdate,this);

文章名称:C#DataSource属性浅析
标题链接:http://www.zyruijie.cn/qtweb/news31/9981.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联