C# DataSource属性浅析

开发 后端
这里介绍C# DataSource属性,因此向上定型成Control类没有意义,唯一可行的办法是通过Reflection API直接操作DataSoruce属性。

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

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

这个方法非常重要,所以最好能够抛出一个含义更明确的信息,而不是抛出标准的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. ...  
  7. }  

 

搜索表现控件的操作通过搜索分页控件的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.  
  14. ApplyDataSensitivityRules();  
  15. BindParent();  
  16. RaiseEvent(DataUpdate,this);  
  17. }  

【编辑推荐】

  1. 如何用C#和ADO.NET访问
  2. 浅析C# Switch语句
  3. C#验证输入方法详解
  4. 简单介绍C# 匿名方法
  5. C# FileSystemWatcher对象
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-13 15:40:29

C#数据绑定控件

2009-09-07 04:56:52

C#模式窗体

2009-08-24 16:39:19

C# 泛型应用

2009-09-07 03:37:51

C#窗体

2009-08-07 17:25:37

C# SortedLi

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2009-08-25 17:59:49

C#入门

2009-08-18 10:30:30

C#枚举

2009-08-27 11:43:31

C#语法

2009-08-17 13:34:02

C#异步操作

2009-09-10 14:52:55

C# get

2009-08-20 14:45:13

C# Switch语句

2009-08-21 17:24:06

C# SingleIn

2009-08-12 15:20:21

C#事件处理

2009-08-20 16:15:19

C# 匿名方法

2009-08-27 13:30:11

C# interfac

2009-08-26 13:07:07

C#交错数组

2009-08-18 09:24:52

C# Anonymou

2009-08-10 17:36:17

C#扩展方法
点赞
收藏

51CTO技术栈公众号