2009年2月28日 星期六

在ASP.NET的Web使用者控制項中,如何利用delegate傳出資料?

問題說明:
一般程式開發過程Reuse的技術是必要的,透過Reuse的做法可精簡系統程式碼;更可以減少程式維護的複雜度。ASP.NET的Web使用者控制項就是基於Reuse的觀念而建立的機制。Web使用者控制項的Reuse可以分為兩種類型:一是不同頁面直接重覆引用、二是透過Property的設定更改控制項元件頁面重覆使用。這兩種類型都有可能需要將處理完成的資料外送給父頁。本文將說明作者如何透過delegate的機制,建立Web使用者控制項專用的事件,傳出選取或處理完成的資料;讓資料選取或處理頁面和後續處理機制分離。如此可以大大的提高此使用者控制項的Reuse功能,傳出的資料也可以有不同的處理彈性。

本文將以資料選取的Web使用者控制項為Reuse元件,在該控制項中包含了一個GridView元件和一個Button元件,GridView中除了資料欄位外,外加一個CheckBox,做為使用者選取該筆資料與否的標誌。
使用者點選資料後,假設需要外送的資料有兩個屬性~:
1.資料來源:string SourceName
2.選取的資料清單:Dictionary SelectedInfo

我的做法如下:

1.宣告一個delegate 命名為:ButtonSelectedClick
2.建立一個EventArgs 命名為:ClickEvenArgsDictionary
程式碼如下:
public delegate void ButtonSelectedClick(object sender, ClickEvenArgsDictionary e);
public class ClickEvenArgsDictionary : EventArgs
{
public Dictionary SelectedInfo { get; set; }
public string SourceName { get; set; }
public ClickEvenArgsDictionary(Dictionary selectedInfo,string sourceName)
{
this.SelectedInfo = selectedInfo;
this.SourceName = sourceName;
}

}

3.在資料處理的頁面加入ButtonSelectedClick的event 命名為 ucSelectedClick
程式碼如下:
public event ButtonSelectedClick ucSelectedClick;

4.在資料處理頁面的Button Click事件中處理deletegate的外傳事件
程式碼如下:
string sourceName="source name";
Dictionary selected = new Dictionary();
...
...
選取資料的處理程式碼
...
ClickEvenArgsDictionary ce = new ClickEvenArgsDictionary(selected,sourceName);
if (ucSelectedClick != null)
this.buttonClick(this, ce);

5.在引用此控制項頁面中Page_Load()中設定資料處理頁面的事件,假設此資料處理頁面的ID:UserDataBrows1
程式碼如下:
UserDataBrows1.ucSelectedClick +=new ButtonSelectedClick(UserDataBrows1_ucSelectedClick);

6.在事件捕捉區完成資料的處理或存檔
程式碼如下:
void UserDataBrows1_ucSelectedClick(object sender, ClickEvenArgsDictionary e)
{
  //在此事件捕捉區中可以取得:e.SourceName 和 e.SelectedInfo
}

完成上面六個處理步驟,就可以輕鬆的捕捉到使用者控制項傳出來的資料,讓控制項和資料處理頁面完全分離。

後記:
1.這是delegate功能的另一種用法,希望能幫助有此需求的系統開發者。
2.Delegates in C# are like functions pointers in C/C++.
3.如有任何建議或改進意見,歡迎隨時來函指正或討論。Thanks.

沒有留言: