當你有二個以上的UserControl,需要平行溝通時要如何實現。
這裡提供一個方法,給大家參考。
方法:利用物件導向特性,先建立一個介面(interface)的類別,在類別裡面定義二個interface,第一個interface主要是用來讓UserControl註冊,所以必須在裡面定義一個方法。
第二個interface主要是用來讓第一個interface呼叫使用,所以裡面也會定義一個有回傳值的方法。
因此呼叫端的UserControl只需要繼承第一個interface並且實作裡面方法,被呼叫端需繼承第二個interface並且實作裡面的方法,若UserControl是呼叫端也是被呼叫端的話,就必需二個interface都要繼承且實作。
再來在引用這二個UserControl的上層頁面或控制項,幫引用的UserControl做註冊的動作。
說這麼多或許大家還不清楚,那麼請看下面範例:
一,先建立二個UserControl,一個名稱為ucTab1另一個為ucTab2,如下圖
二,然後開始布置UserControl上面的控制項,為了方便示範,因此我將二個UserControl的元件都佈置一樣,如下圖:
三,ucTab1跟ucTab2都佈置完畢後,再將這個UserControl放置到Default.aspx頁面上。
如下圖:
四,接下來就新增一個類別,用來定義介面(interface),類別名稱為UcToUc.cs檔。
第一個介面名稱宣告為IMain,第二個為ISub。
IMain程式區塊裡面我們在定義一個方法,方法名稱為:void RegUserControl(ISub obj);
同樣在ISub程式區塊裡面也定義一個方法,名稱為:SortedList GetControl();
需注意SortedList GetControl();是有回傳值的,回傳型態:SortedList 類別。
如下:
01 | using System.Collections; |
02 |
03 | public interface IMain |
04 | { |
05 | void RegUserControl(ISub obj); |
06 | } |
07 |
08 | public interface ISub |
09 | { |
10 | SortedList GetControl(); |
11 | } |
五,開始在ucTab1跟ucTab2的CS檔寫一樣的程式碼。
1.先繼承剛剛定義的介面(interface),IMain跟ISub。
2.宣告一個全域變數ArrayList _RegControl = new ArrayList();
這個類別的參考主要是用來紀錄,有那些控制項跟我註冊。
3.實做IMain的介面及方法,_RegControl.Add(obj);是將註冊的UserControl記錄在ArrayList 裡面。
4.實做ISub的介面及方法,這個介面的方法GetControl()是要讓對方呼叫來取得我的參數,
方法裡面我是使用SortedList類別來放要傳遞的值。
5.當Button被按下去時,會呼叫我自訂的方法ShowList(),
這個方法主要是將已經跟我註冊的Usercontrol,取得值然後設定給ListBox顯示。
至於要如何取的另一個UserControl的值,請注意這行(ISub)_RegControl[i]).GetControl()。
就是將紀錄在ArrayList裡面的UserControl取出來,
並強轉型為 ISub,因為在ISub我們有定義GetControl()的方法,
所以我們就可以利用這方法把值給取出來。
在這裡須注意到一件事,就是要註冊的UserContol都需要去繼承,ISub並實作裡面的方法。
如下圖:
六,最後在Default.aspx.cs的Page_Load幫ucTab1跟ucTab2註冊。
第一行是將ucTab2註冊給ucTab1。
第二行是將ucTab1註冊給ucTab2。
01 | public partial class _Default : System.Web.UI.Page |
02 | { |
03 | protected void Page_Load( object sender, EventArgs e) |
04 | { |
05 | this .ucTab11.RegUserControl((ISub) this .ucTab21); |
06 |
07 | this .ucTab21.RegUserControl((ISub) this .ucTab11); |
08 | } |
09 |
10 |
11 | } |
七,好了之後我們就可以執行Default.aspx測試看看結果,先在ucTab1的欄位輸入值,
然後在ucTab2按下Button,就會把ucTab1所輸入的值帶進ucTab2的ListBox裡面。
如下圖:
八,再來換在ucTab2的欄位輸入值,按下ucTab1的Button來看結果。
九,最後就是這樣。