asp.net控件開發基礎(22) --------定義數據源控件(1)

  本文出處:http://www.cnblogs.com/Clingingboy/archive/2007/03/21/683238.html

示例代碼

     上兩篇討論瞭如何定義結合數據源控件的數據綁定控件.這次我們一起來看下數據源控件是如何實現的。asp.net2.0已經爲我們提供了很多數據源控件,相信大家都用過了,也希望大家對其有所熟悉.關於它能做什麼就不說了。下面我們也一起來看看,如何簡單的實現.

         
一.你必須瞭解的

1.關於數據源控件(DataSourceControl)


雖然表面看來,給數據綁定控件指定DataSourceID屬性,數據源控件幫你做了一切工作,其實不然,數據源控件只負責收集與數據交互的相關信息,如:SqlDataSource的ConnectionString,AccessDataSource的DataFile
收集好這些信息後交給DataView類統一處理數據,但用戶一般不與DataView類直接打交道,而是DataSourceControl,所以DataSourceControl需要獲取DataView類,從而間接的調用數據相關操作方法。
因此,.net抽象定義出了一個接口IDataSource,實現 IDataSource 接口的任何類都是數據源控件,
.net爲我們提供了一個起點DataSourceControl類,其實現了IDataSource 接口



2.數據處理(DataSourceView數據源視圖)

上面已經談到,數據源控件將相關數據傳給DataSourceView,處理數據。如SqlDataSourceView提供了相當多的數據操作,最基本的則是檢索數據,接着還有添加,更新,刪除等操作。
.net爲我們提供了一個起點DataSourceView類,其中ExecuteSelect方法作爲抽象方法,子類必須實現.



二.最簡單實現(示例)

什麼是最簡單實現呢?比如只提供最基本的檢索數據功能的數據源控件,這裏我們只需要實現上面兩個類的抽象方法就OK了,還是看示例吧.

(1)定義DataSourceView 實現ExecuteSelect方法


三.加強功能

上面是最簡單的實現,這樣的示例你應該很容易理解。看上上面的示例,你一定會說這樣的控件有何用,是的,沒用。在這裏我們應該熟悉下內置的數據源控件爲我們提供了哪些功能。下面可能是你需要的

1.數據操作需要的參數,.net已經爲你提供Parameter類及ParameterCollection集合
2.返回數據類型DataReader or DataSet
3.數據操作執行語句(即sql命令語句)
4.描述sql命令類型 (即文本 or 存儲過程)
5.事件 在數據操作前後提供事件觸發,如Selected(檢索數據完成後)和Selecting(檢索數據前)
...還有其他你可能想的到的。
還是上面的話,DataSourceControl封裝一些基本的屬性提供給DataSourceView使用,DataSourceView提供實現.

四.簡單思路

1.定義需要的成員

這裏先說明DataSourceView的實現,因爲其爲核心操作的具體實現

這裏你可以根據你提供的具體操作的一個操作來實現,下面的則可觸類旁通,如檢索數據操作

(1)SelectCommand
屬性,用於檢索數據的字符串

      public string SelectCommand
      
{
          
get return ViewState["SelectCommand"!= null ? (string)ViewState["SelectCommand"] : string.Empty; }
          
set { ViewState["SelectCommand"= value; }
      }

(2)SelectCommandType屬性,用於描述sql命令類型

      public SqlDataSourceCommandType SelectCommandType
      
{
          
get return ViewState["SelectCommandType"!= null ? (SqlDataSourceCommandType)ViewState["SelectCommandType"] : SqlDataSourceCommandType.Text; }
          
set { ViewState["SelectCommandType"= value; }
      }

(3)SelectParameters屬性,獲取該集合包含由SelectCommand屬性使用的參數集合

      public ParameterCollection SelectParameters
      
{
          
get
          
{
              
if (selectParameters == null)
              
{
                  selectParameters 
= new ParameterCollection();
                 
              
return selectParameters;
          }

      }

(4)Can數據操作(如CanDelete)屬性,由於檢索數據爲必須的操作,所以沒有CanSelect屬性

(5)Selected和Selecting事件

      public event SqlDataSourceStatusEventHandler Selected
      
{
          add 
{ Events.AddHandler(SelectedKey, value); }
          remove 
{ Events.RemoveHandler(SelectedKey, value); }
      }


      
public event SqlDataSourceSelectingEventHandler Selecting
      
{
          add 
{ Events.AddHandler(SelectingKey, value); }
          remove 
{ Events.RemoveHandler(SelectingKey, value); }
      }

(6)ExecuteSelect具體實現方法

        protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
        
{
        }


此外DataSourceControl也需要根據不同數據的來源定義相關屬性,當然還有其他你可能想到的,你也可以加進去.

此篇就先此打住,至少實現了一個最簡單的示例^__^.下次我們繼續,不然篇幅可能太長.有些問題放在一起太多,可能太亂.其實現在我們已經看到一些自定義的數據源控件了,如支持NBear和Nhibernate的數據源控件,大家可以參考以下.

本文結束^__^  
  public class MyDataSourceView : DataSourceView
    
{

        
public MyDataSourceView(MyDataSourceControl owner, string name)
            : 
base(owner, name)
        
{

        }


        
protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
        
{
            arguments.RaiseUnsupportedCapabilitiesError(
this);

            SqlConnection conn 
=
               
new SqlConnection("Server=localhost;Database=Northwind;uid=sa;pwd=123456");
            conn.Open();

            SqlCommand cmd 
=
               
new SqlCommand("SELECT CustomerID, ContactName, ContactTitle, CompanyName FROM Customers WHERE CustomerID LIKE '[AB]%'",
               conn);
            
return (IEnumerable)cmd.ExecuteReader(CommandBehavior.CloseConnection);

        }

    }

(2)定義DataSourceControl,獲取DataSourceView

   public class MyDataSourceControl : DataSourceControl
    
{
        
protected override DataSourceView GetView(string viewName)
        
{
            
return new MyDataSourceView(this"");
        }

    }

你可能不相信,你已經完成了一個數據源控件了,使用方法一樣,如下

        <aspDemo:MyDataSourceControl ID="MyDataSourceControl1" runat="server"></aspDemo:MyDataSourceControl>
        
<asp:GridView ID="GridView1" runat="server" DataSourceID="MyDataSourceControl1">
        
</asp:GridView>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章