上一篇討論了如何實現一個簡單的數據源控件,但還沒有完全的實現.這次我們具體的實現一些方法來加強數據源控件的功能.這裡我們根據SqlDataSource控件的一些功能來實現.
本篇示例源碼來自Professional ASP.NET2.0 ServerControl and Component Development,即是模仿SqlDataSource而制作.我把控件功能減弱,代碼整理了下,我們只關注重要的部分,一步一步上去.
一.概念
1.首先你必須熟悉ADO.NET的使用,然後抽象出一部分屬性和方法,如執行sql語句命令類型,這個屬性你便可以抽象出來,當是控件功能的一部分.所以這部分代碼不再列出,大家仔細看就會明白了.
2.數據操作注意事項
(1)數據前後操作事件,我們見過SqlDataSource的數據前後操作事件,如讀取數據,前後事件則是Selecting和Selected
假設getData方法是讀取數據庫,那麼寫成代碼就是這樣
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
{
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事件通知數據發生了變化,就會幫你自動重新綁定了,即除了讀取數據以外的其他數據操作都需要調用這個方法.假設是刪除操作,則代碼如下
protected override int ExecuteDelete(IDictionary keys, IDictionary oldValues)
{
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屬性
指定能否進行數據操作,讀取數據默認可以,其他的操作可以在方法開始部分加上如下代碼,假設是不支持刪除操作
protected override int ExecuteDelete(IDictionary keys, IDictionary oldValues)
{
if (!CanDelete)
throw new NotSupportedException("不支持刪除操作");
}