Program,Life,Society.....

导航

统计

公告

深入了解数据源控件(Data Source controls):DataSourceView(三)

深入了解数据源控件(Data Souce controls):BaseDataBoundControl和DataBoundControl(一)
深入了解数据源控件(Data Source controls):DataSourceControl(二)


原文:http://www.manuelabadia.com/blog/PermaLink,guid,e4f162b4-2adb-46d7-9d31-be32ff9b1347.aspx

是开始谈论DataSourceView抽象类的时候了。

在DataSourceView类中暴露数据源控件的真正的功能实现(例如你可以更新,插入,删除,翻页,排序...),DataSourceView类中还有CRUD(select,insert,update,delete)操作的方法。它是到目前为止对于新的数据绑定机构的大部分的功能组成。

它暴露了下面的属性:

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; }

如果你还记得在我前面的文章中提到的,一个数据源控件可以有很多的视图,每一个视图都有一个唯一的名字。你可以得到这个名字通过Name属性。

其他的公共属性只是表明支持什么样的功能。如果你仔细看,你会发现没有CanSelect属性,因为控件必须要提供选取的功能。默认的CanXXX方法实现是返回false。

如果在自己的DataSouceView中可以根据数据源的要求来实现这些方法。例如,如果你的DataSourceView来自一个提供街上交通负荷信息的web service,你紧紧是得到数据,那么默认的CanXXX方法就可以满足你的要求。然而,你想要的到一个可以暴露你的逻辑区域的DataSourceView,你可能要支持选择,插入,更新和删除操作,这就要求在实现CanXXX方法的时候你要定义一些逻辑,当用户满足这些逻辑是CanXXX方法才会有效,因为如果你支持更新操作,但是用户没有提供更新方法供调用,你就不能更新数据源中的数据。

DataSouceView中受保护Evets属性是为了节省空间。如果你添加了一个没有指定添加和移除方法的事件,编译器会创建一个私有字段来存储这个事件。作为起源类可能有很多的事件,如果了个客户类使用其中很少的事件,这个类就浪费了很多的空间。为了减少没有使用的事件来节省控件,在这种情形下建议使用EventHandlerList来存储事件,在事件处理程序委托的列表中明确的添加或者移除事件。

DataSouceView还有一个公共事件:
public event EventHandler DataSourceViewChanged;

无论何时更改数据源中的视图都将触发这个事件并且通知数据绑定控件及时的更新数据(了解更多看前一篇文章)。

注意当你创建一个DataSourceView,你可以从IdataSource接口中捕获DataSouceChanged事件来更新DataSourceView,来触发DataSourceViewChanged。

这个类有下面的方法:
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);

当数据绑架控件执行CRUD操作的时候,前四个方法将被调用。这些方法支持异步数据访问,在默认的情况下调用这些受保护的ExecuteXXX方法不是异步而是同步的。ExecuteInsert,ExecuteUpdate和ExecuteDelete没有抽象的方法因为DataSource默认只有Select是支持可用的,这些方法被调用时将抛出NotSupportedException异常。如果你真的想要支持异步访问,你可以看看参看一下Nikhil的帮助类。

当数据改变时,你可以用OnDataSourceViewChanged方法来触发DataSourceViewChanged事件。

最后的一个方法是RaiseUnsupportedCapabilityError,下面进一步解释。当一个数据源视图请求一个选取操作,一个被实例化的DataSourceSelectArguments传入选取方法(ExecuteSelect)的第一个参数。请求了选取操作数据绑定控件通过DataSouceView中支持的功能的到数据。当调用一个Select方法时,数据绑定控件使用 DataSourceSelectArguments 类请求数据源控件对结果集执行与数据相关的附加操作(如对数据排序或返回数据的特定子集)。在得到数据之前,DataSourceView将调用DataSourceSelectArguments类的RaiseUnsupportedCapabilitiesError方法,这个方法为 ExecuteSelect 操作请求的功能与指定的数据源视图所支持的功能进行比较。如果不支持这个功能,RaiseUnsupportedCapabilitiesError调用DataSourceViews的RaiseUnsupportedCapabilitiesError方法并抛出一个异常。

在下一节中谈论绑定表达式。

posted on 2007-11-13 15:36 rippleyong 阅读(...) 评论(...) 编辑 收藏