简单的说,DataSource数据源控件是一个抽象的数据库,可以在该数据库里进行数据的操作(Select,Delete,Update和Insert)。数据源控件通过控件的DataSourceID和具有绑定功能的数据源控件(例如GridView)联系起来,下面是DataSource控件的定义:
public abstract class DataSourceControl : Control, IDataSource, IlistSource
可以看到,DataSourceControl除了实现IlistSource接口外,还需要实现IdataSource接口,因为该控件需要完成两个功能:
1) 传统的具有DataGrid的数据绑定控件。
2) ASP.NET2.0新增的具有声明性的数据绑定功能。
由于上面两个功能的支持,这就是本书在介绍绑定控件时提到的为什么可以通过两种方式绑定数据源的原因。
下面是DataSource控件提供的几个重要方法与说明。
方法 |
说明 |
DataBind |
将数据源绑定到被调用的服务器控件及其所有子控件。 (从 Control 继承。) |
DataBindChildren |
将数据源绑定到服务器控件的子控件。 |
GetView |
获取与数据源控件关联的命名的数据源视图。 |
GetViewNames |
获取名称的集合,表示与 DataSourceControl 控件关联的 DataSourceView 对象的列表。 |
DataSource控件本身很简单,因为所有的逻辑操作都是由DataSourceView类来完成。作为最为基本要求,DataSource必须能够从基础数据库里检索数据(也就是必须执行Select),而对于数据的编辑(例如Insert,Update和Delete)则是可选的。
和数据库实体类似,数据库可以包含多个视图,同样DataSource控件可以认为是一个数据容器,它可以包含一个或者多个DataSourceView,每一个DataSourceView必须具有唯一个视图名称以便彼此区分。例如DataSource控件可能提供过滤的数据视图,同时还可以提供排序后的数据视图。那么数据绑定控件如GridView又怎么区分每一个视图呢?
对于数据绑定控件提供了DataMember属性,该属性可以设置为DataSourceView视图的值。注意:如果您没有明确指出数据视图的名称,系统将使用默认的名称视图。
现在我们看看DataSourceVIew提供了哪些成员?如下所示:
public string Name { get; }
public virtual bool CanDelete { get; }
public virtual bool CanInsert { get; }
public virtual bool CanPage { get; }
public virtual bool CanRetrieveTotalRowCount { get; }
public virtual bool CanSort { get; }
public virtual bool CanUpdate { get; }
protected EventHandlerList Events { get; }
这里需要注意两点:
正如上面我们说过,DataSourceVIew可以提供多个视图,所以利用Name属性,我们就可以获取每一个视图的名称。其次,对于CanXXX方法,您可以看到它具并没有CanSelect属性,这是因为CanSelect是必须的,而CanXXX默认值则是false。
如果我们需要自定义DataSourceView,例如我们向利用自定义的DataSourceView来从基础数据Web Service获取数据源,那么我们就可以利用CanXXX属性来执行逻辑操作。
DataSourceView控件有一个事件:该实现的定义如下:
public event EventHandler DataSourceViewChanged;
该事件在基础数据库里的数据改变时触发,而该事件的触发会进一步执行数据绑定,进而刷新数据绑定控件的数据显示
当自定义DataSOurceView控件时,我们需要捕捉IDataSource接口的DataSourceChanged事件,以便更新DataSourceView,并继而触发DataSourceViewChanged
DataSourceView同样还提供了下面的方法来执行数据操作
public virtual void Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback);
public virtual void Insert(IDictionary values, DataSourceViewOperationCallback callback);
public virtual void Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback);
public virtual void Delete(IDictionary keys, IDictionary oldValues, DataSourceViewOperationCallback callback);
protected internal abstract IEnumerable ExecuteSelect(DataSourceSelectArguments arguments);
protected virtual int ExecuteInsert(IDictionary values);
protected virtual int ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues);
protected virtual int ExecuteDelete(IDictionary keys, IDictionary oldValues);
protected virtual void OnDataSourceViewChanged(EventArgs e);
protected internal virtual void RaiseUnsupportedCapabilityError(DataSourceCapabilities capability);
这些方法的前四个可以在数据绑定中执行Select,Insert,Delete和Update操作。这而默认命名方式是ExecuteXXX命名的方法可以支持异步调用,ExecuteInsert, ExecuteUpdate 和 ExecuteDelete并不是抽象方法是因为这些方法可以执行Select的运行结果,所有对它的直接调用将抛出NotSupportedException异常。