原文:http://www.manuelabadia.com/blog/PermaLink,guid,eb...
前一篇:深入了解数据源控件(Data Souce controls):BaseDataBoundControl和DataBoundControl(一)
在前一篇文章,我解释了数据绑定控件的基本结构(当框架调用绑定方法时怎样得到数据从DataSourceView)。现在是该解释DataSourceControl类的时候了。
一个很好消息是我发现了Nikhil Kothari些的关于数据源控件的一系列文章,他是ASP.NET开发组的成员:
http://www.nikhilk.net/DataSourceControlBasics.aspx
http://www.nikhilk.net/DataSourceControlParameters.aspx
http://www.nikhilk.net/DataSourceControlsAsync.aspx
http://www.nikhilk.net/DataSourceControlsCache.aspx
http://www.nikhilk.net/DataSourceControlsDesignTime.aspx
如果你没有读过它的书《ASP.NET服务器控件与组件开发》,推荐读一下。
如果你想在数据绑定控件上使用新的数据绑定机制,你必须有一个实现自IDataSource的数据源,或者用一个ASP.NET2.0自带的数据源控件(SqlDataSource和ObjectDataSource)
为了实现自定义数据源,你可以继承自DataSourceControl,因为这个类可以让你更简单实现。DataSource控件从Control类继承,实现自IDataSouce和IListSource接口。让我们研究这些接口,看看如何从DataSourceControl实现。
IDataSouce接口很简单,它只有下面的公共方法:
DataSourceView GetView(string viewName);
ICollection GetViewNames();
第一个方法是绑定一个特定的视图,第二个是得到有多少个暴露的DataSourceViews和他们的名称。数据源控件(SqlDataSource和ObjectDataSoucr)都是只有一个视图,但是你可发现用多个视图这种方式暴露数据源中的部分数据要比用一个单一视图有用的都。
如果你看过我以前的文章,数据绑定控件有一个方法调用ConnectToDataSouceView,这个方法试图查找一个在数据源中的视图(很容易完成在IDataSource接口中)。然而,为了支持原来的绑定结构,一个数据源控件还要有一个DataSource属性,这个属性可以设置为不是从IDataSouce实现的对象,为了完整,DataBoundControl类有一个只读的DataSourceControl封装,在这种情景下它暴露数据是只读的DataSouceView
IDataSource接口还暴露了一个公共方法
event EventHandler DataSourceChanged;
在我以前的文章中我已经解释了,当一个数据源控件绑定到一个数据源控件时,数据源控件将捕获一个DataSourceView的DataSouceViewChanged事件。当数据源改变,这个时间也被触发同时数据绑定控件调用DataBind方法来刷新数据。如果数据源控件改变了,DataSouceChanged事件将被触发,所有的DataSourceViews将捕捉并更新自己的数据(在DataSourceView类中执行这个事件且触发DataSourceViewChanged事件)。
DataSouceControl实现了IDataSouce接口,但是没有实现没有做任何事,因为它调用保护方法GetView和GetViewNames方法将被在它的子类中实现。
IListSource接口使一个对象返回一个列表,它可以绑定到一个数据源上。为什么让数据源控件实现IListSource呢?这是为了绑定一个数据源控件绑定到数据绑定控件的DataSource属性,数据绑定控件不是继承自BaseBoundControl,例如DataGrid。
DataSouceControl实现IlistSouce接口,可以方便的调用ListSourceHelper类,这个类暴露一个视图列表(DataSouceViews)去绑定(这个很像DataSet中有很多的DataTables)。这个视图列表实现ITypeList接口,为绑定而暴露Schema。我不想详细家少ITypeList,但是如果你对这个感兴趣你可以看下面的链接
http://weblogs.asp.net/fbouma/articles/115837.aspx
为了长话短说,实现自IListSource的DataSourceControl暴露了视图列表,每一个视图是以一个IEnumerable类型的只读属性呈现的,在视图的ExecuteSelect方法中返回它的值。
DataSouceControl其他的内容是有一些隐藏的属性在 设计时,因为虽然DataSouceControl是继承自Control,但是它不是一个可视化的控件,它也不是Component因为Component在ASP.NET2.0中无效的。
关于DataSouceControl类的就是这些了,不久我们将谈谈关于DataSourceView,它是真正是实现数据绑定的类。