asp.net控件開發基礎(23)
討論了如何實現一個簡單的數據源控件,但還沒有完全的實現.這次我們具體的實現一些方法來加強數據源控件的功能.這里我們根據SqlDataSource控件的一些功能來實現。本篇示例源碼來自Professional ASP.NET2.0 ServerControl and Component Development,即是模仿SqlDataSource而制作.我把控件功能減弱,代碼整理了下,我們只關注重要的部分,一步一步上去。
一.概念
1.首先你必須熟悉ADO.NET的使用,然后抽象出一部分屬性和方法,如執行sql語句命令類型,這個屬性你便可以抽象出來,當是控件功能的一部分.所以這部分代碼不再列出,大家仔細看就會明白了。
2.數據操作注意事項
(1)數據前后操作事件,我們見過SqlDataSource的數據前后操作事件,如讀取數據,前后事件則是Selecting和Selected
假設getData方法是讀取數據庫,那么寫成代碼就是這樣
{
SqlDataSourceSelectingEventArgs e = new SqlDataSourceSelectingEventArgs(com, arguments);
//嘗試數據檢索操作前引發 Selecting 事件
OnSelecting(e);
return getData();
SqlDataSourceStatusEventArgs ee = new SqlDataSourceStatusEventArgs(com, -1, null);
//嘗試數據檢索操作后引發 Selecting 事件
OnSelected(ee);
}
其他數據操作也一樣
(2)自動重新綁定
讀取數據是基本的,不存在對數據庫的更改,當對數據進行增,刪,改時.數據發生了變化,以前我們則是手動進行重新綁定,現在也是,只不過方式變了而已.DataSourceView中存在OnDataSourceViewChanged 方法,我們只需要調用這個方法引發DataSourceViewChanged事件通知數據發生了變化,就會幫你自動重新綁定了,即除了讀取數據以外的其他數據操作都需要調用這個方法.假設是刪除操作,則代碼如下
{
SqlDataSourceCommandEventArgs e = new SqlDataSourceCommandEventArgs(com);
OnDeleting(e);
affectedRows = com.ExecuteNonQuery();
OnDataSourceViewChanged(EventArgs.Empty);
SqlDataSourceStatusEventArgs ee = new SqlDataSourceStatusEventArgs(com, affectedRows, exception);
OnDeleted(ee);
return affectedRows;
}
(3)Can屬性
指定能否進行數據操作,讀取數據默認可以,其他的操作可以在方法開始部分加上如下代碼,假設是不支持刪除操作





(4)數據檢索額外操作
數據源控件還可以提供額外的數據操作,如排序,分頁等。
DataSouceView的ExecuteSelect方法里的參數正是DataSourceSelectArguments類型,可以通過其AddSupportedCapabilities方法添加功能,然后調用RaiseUnsupportedCapabilitiesError方法檢測操作要求與實現是否符合(即你指定了排序的功能,但數據源控件并未實現這個操作,防止弄虛做假的事情出現,核對一下功能:))。當然前提是數據源提供這樣的功能實現,注意DataSourceSelectArguments類的屬性與支持功能相對應,大家可以查看MSDN。
代碼如下






接著還要重寫DataSourceView的RaiseUnsupportedCapabilityError方法
{
if ((((capability & DataSourceCapabilities.Page) != 0) && !CanPage) ||
(((capability & DataSourceCapabilities.RetrieveTotalRowCount) != 0) && !CanRetrieveTotalRowCount) ||
(((capability & DataSourceCapabilities.Sort) != 0) && !CanSort))
throw new NotSupportedException();
base.RaiseUnsupportedCapabilityError(capability);
}
(5)執行數據操作(同步與異步)
ExecuteInsert等方法為具體實現Insert方法則負責調用,其DataSourceView類支持數據的異步操作,如





但默認情況下是同步的,所以還需要在子類實現一個同步的方法




以上是我認為值得注意的地方。DataSourceView類就是一個干活的類.反而DataSourceControl差不多什么也沒做,只調用DataSourceView的相關方法.其只為DataSourceView類提供了ConnectionString屬性(數據連接字符串).
DataSourceControl實現了IDataSource接口,當數據源發生變化時,則需要調用IDataSource接口的DataSourceChanged事件,DataSourceControl提供了RaiseDataSourceChangedEvent方法調用,如修改了ConnectionString屬性就需要調用此方法,如



















以上為我學習方法的總結,都是比較重要的地方。如果列代碼的話,不適合.因為大家數據庫操作本來就會的。熟悉上面的操作過程然后再進行編寫就好多了。還希望與大家多交流,錯誤的地方還請指出。
上一篇:asp.net控件開發基礎(22)