asp.net控件開發基礎(23)

作者: Clingingboy  來源: 博客園  發布時間: 2010-10-02 19:56  閱讀: 867 次  推薦: 0   原文鏈接   [收藏]  

  討論了如何實現一個簡單的數據源控件,但還沒有完全的實現.這次我們具體的實現一些方法來加強數據源控件的功能.這里我們根據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("不支持刪除操作");
      }

  (4)數據檢索額外操作

  數據源控件還可以提供額外的數據操作,如排序,分頁等

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

代碼如下

     protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
      
{
          arguments.AddSupportedCapabilities(DataSourceCapabilities.Page);
          arguments.AddSupportedCapabilities(DataSourceCapabilities.Sort);
          arguments.RaiseUnsupportedCapabilitiesError(
this);
      }

  接著還要重寫DataSourceView的RaiseUnsupportedCapabilityError方法

 
protected override void RaiseUnsupportedCapabilityError(DataSourceCapabilities capability)
{

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類支持數據的異步操作,如

public virtual void Insert (
    IDictionary values,
    DataSourceViewOperationCallback callback
)

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

      public int Insert(IDictionary values)
      
{
          
return ExecuteInsert(values);
      }

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

public virtual string ConnectionString
{
    
get
    {
        
if (this._connectionString != null)
        
{
            
return this._connectionString;
        }

        return string.Empty;
    }

    set
    {
        
if (this.ConnectionString != value)
        
{
            
this._connectionString = value;
            
this.RaiseDataSourceChangedEvent(EventArgs.Empty);
        }

    }

}

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

上一篇:asp.net控件開發基礎(22)
0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()