[ASP.NET]WebUserControl裡的Button觸發事件,透過Interface取得使用Page內的資料

之前介紹過Web User Contro(以下簡稱wuc)使用觀察者模式,事件模式來做溝通,這一篇小喵來個練習,透過wuc裡面的按鈕,按下按鈕後,觸發事件,去取用使用該wuc那個Page的內容。

緣起:

之前介紹過Web User Contro(以下簡稱wuc)使用觀察者模式,事件模式來做溝通,這一篇小喵來個練習,透過wuc裡面的按鈕,按下按鈕後,觸發事件,去取用使用該wuc那個Page的內容。

安排wuc:

首先在wuc裡面安排如下的控制項:

<hr />
Name:<asp:Label ID="lblName" runat="server" Text=""></asp:Label><br />
Guid:<asp:Label ID="lblGuid" runat="server" Text=""></asp:Label><br />
<asp:Button ID="btnGetGUID" runat="server" Text="從Page取得資料Guid" />

需求很簡單,就是按下按鈕後,從使用該wuc的Page取用該內頁的內容(Name, Guid),然後顯示在wuc裡面的兩個Label中。
為了讓wuc可以單純化,並不需要知道使用此wuc的Page有什麼控制項,只需要知道我要用的就是兩個資料(sName,sGuid),小喵此次練習事件模式的撰寫

事件模式的Interface

首先在App_Code新增一個類別,名稱為IEventMode0001,預設會有個Class : IEventMode0001,不過我們要用的是Interface,因此將這個類別刪除,然後撰寫如下的程式碼

Imports Microsoft.VisualBasic

'宣告一種Handler的方式
Public Delegate Sub GetDataHandler(ByVal sender As Object)

'宣告有個事件模式的介面,介面名稱為IEventMode0001
Public Interface IEventMode0001
    '這類別中,有個事件是GetData,並且是GetDataHandler這種方式
    Event GetData As GetDataHandler
End Interface

'宣告有個接收者的介面
Public Interface IReceiver0001
    '這介面有個Sub(UseData),會傳入sName,sGuid
    Sub UseData(ByVal sName As String, ByVal sGuid As String)
End Interface

Impletements Interface

接著撰寫wuc的程式碼,首先這個wuc同時會implements IEventMode0001與IReceiver0001這兩個介面

Implements介面後,會產生相關的Code,我們稍加使用如下:

Implements IEventMode0001
Implements IReceiver0001

Public Event GetData(ByVal sender As Object) Implements IEventMode0001.GetData

Public Sub UseData(ByVal sName As String, ByVal sGuid As String) Implements IReceiver0001.UseData
    Me.lblName.Text = sName
    Me.lblGuid.Text = sGuid
End Sub

Protected Sub btnGetGUID_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetGUID.Click
    RaiseEvent GetData(sender)
End Sub

我們設計當wuc的Button Click時,Raise GetData 的Event,到時候使用這wuc的物件,再來決定當GetDat Event觸發時,要做什麼事。

再來設計UseData,這裡面就把接收到的sName, sGuid放入兩個Label。使用這個wuc的在適當的時機,透過這個Sub來傳入sName, sGuid。

wuc程式就這麼短短的,撰寫上並不需要知道誰用wuc,也不需要知道使用wuc的來源(page)是什麼控制項

 

設計一個使用wuc的Page

接著我們設計一個使用這wuc的Page,首先安排如下的畫面

<asp:Button ID="btnGenGuid" runat="server" Text="產生Guid" /><br />
Guid:<asp:TextBox ID="txtGuid" runat="server"></asp:TextBox><br />
Name:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />

<br />
<uc1:WUC0001 ID="WUC00011" runat="server" />
<br />

接著在他的CodeFile設計如下

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)
    AddHandler Me.WUC00011.GetData, AddressOf GetData1
End Sub

Protected Sub btnGenGuid_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGenGuid.Click
    Me.txtGuid.Text = System.Guid.NewGuid.ToString.ToUpper
End Sub

Public Sub GetData1(ByVal sender As Object)
    Dim sName As String = Me.txtName.Text
    Dim sGuid As String = Me.txtGuid.Text

    Me.WUC00011.UseData(sName, sGuid)
End Sub

設計btnGenGuid按下後產生Guid在txtGuid,這部份與wuc無關,只是要產生資料罷了!!

設計GetData1這個Sub,用意是將畫面中的txtName, txtGuid的內容,透過wuc的UseData傳回去

最後要讓wuc的GetData事件,與GetData1這個Sub建立參考,讓事件發生後,能夠呼叫這個Sub起來作事。

這樣就可以達成目的囉。

設計另一個使用不同控制項的Page

我們在增加另一個,這次使用的控制項改一下,改成用DropDownList

Name:<asp:DropDownList ID="ddlName" runat="server">
    <asp:ListItem>topcat</asp:ListItem>
    <asp:ListItem>Allen</asp:ListItem>
    <asp:ListItem>Amy</asp:ListItem>
</asp:DropDownList><br />
Guid:<asp:DropDownList ID="ddlGuid" runat="server">
    <asp:ListItem>D9A1D2BA-D841-48EF-A90B-38BEEBCE0953</asp:ListItem>
    <asp:ListItem>81218F07-3A41-4955-B9C0-E9EEFB60B22D</asp:ListItem>
    <asp:ListItem>BF3CF700-64E0-42FE-8DEE-13AAF676CFD3</asp:ListItem>
    <asp:ListItem>48DB8769-9766-41DC-865D-1E938833EDD5</asp:ListItem>
</asp:DropDownList><br />
<br />
<uc1:WUC0001 ID="WUC00011" runat="server" />

原理與上面相同,我們直接看CodeFile

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)
    AddHandler Me.WUC00011.GetData, AddressOf SetDat2
End Sub

Public Sub SetDat2(ByVal sender As Object)
    Dim sName As String = Me.ddlName.SelectedValue
    Dim sGuid As String = Me.ddlGuid.SelectedValue
    Me.WUC00011.UseData(sName, sGuid)
End Sub

一樣是寫個Sub SetData2然後裡面將畫面上的DropDownList的內容,透過wuc的UseData將資料傳回。


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6) 
topcat
Blog:http://www.dotblogs.com.tw/topcat