深入了解数据源控件(Data Source controls):DataSourceControl(二)

原文: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,它是真正是实现数据绑定的类。

posted @ 2007-11-12 15:08 涟漪勇 阅读(1892) 评论(9)  编辑 收藏 所属分类: 01.DotNet

  回复  引用  查看    
#1楼 2007-11-12 16:17 | Clingingboy      
关键还是在于DataSourceView的实现
  回复  引用  查看    
#2楼 [楼主]2007-11-12 16:43 | 涟漪勇      
@Clingingboy
你写的《asp.net控件开发基础》系列文章很好,受益不少。
  回复  引用  查看    
#3楼 2007-11-12 17:30 | Clingingboy      
楼主继续,我看到DataSouceControl这里,下面就少看了.
  回复  引用  查看    
#4楼 2007-11-12 17:46 | 兴百放      
虽然Vs2005提供了SqlDataSource控件
不过我很少使用它,虽然只是设置设置就行,但是我感觉不怎么好控制,可能是我没有深入的研究它,但是我也看不出,他在那些方面的优势(除了编辑,更新,删除数据)
还望指导指导
  回复  引用  查看    
#5楼 [楼主]2007-11-12 17:57 | 涟漪勇      
@兴百放
SqlDataSource我的理解是主要是方便的操作,使用很少的代码或不使用代码就可以在 ASP.NET 网页中显示和操作数据。如果是不很复杂的应用而且以后不会有大的改动,SqlDataSource是不错的选择。

SqlDataSource具体的优势你可以看看MSDN,可能也算不上什么优势,不过我感觉除了你说的外还有就是这个东西可以连接不同数据库,缓存数据,同VS自带控件结合紧密等方面吧。
  回复  引用  查看    
#6楼 2007-11-12 18:33 | Enzo      
@涟漪勇
个人觉得简单的页面演示可以用
至于用不同的数据库 在底层用代码也可以快速实现
  回复  引用    
#7楼 2007-11-12 19:38 | 笑指南山 [未注册用户]
是的,简单的演示不错~
  回复  引用  查看    
#8楼 [楼主]2007-11-13 15:39 | 涟漪勇      
哈哈,大家终于找到SqlDataSource的真正用处了:做简单演示程序。