天天看點

内容頁響應母版頁控件的事件

内容頁響應母版頁控件的事件

左直拳

在内容頁裡面,如果想響應位于母版頁的控件的事件,該怎麼辦呢?

MSDN開宗明義地告訴我們:對于控件而言,事件是在本地處理的,即内容頁中的控件在内容頁中引發事件,母版頁中的控件在母版頁中引發事件。控件事件不會從内容頁發送到母版頁。同樣,也不能在内容頁中處理來自母版頁控件的事件。

那是否意味着内容頁中不能處理母版頁控件的事件?如果不行的話,真不友善!

不過我試了一下,發現隻要将我們希望執行的函數委托給該控件的事件就可以。

比如說,在母版頁中有個按扭

<asp:Button ID="Button1" runat="server" Text="Button"/>

那麼在内容頁中可以在Page_Load裡委托函數:

protected void Page_Load(object sender, EventArgs e)

{

Button B1 = (Button)Page.Master.FindControl("Button1");

B1.Click += new EventHandler(B1_Click);

}

然後将自己希望執行的代碼放在函數B1_Click裡:

    protected void B1_Click(object sender, EventArgs e)

    {

        Response.Write("Hello World!");

運作以後,按下Button1,頁面即會顯示Hello World!

如果母版頁中也有該按扭Click事件:

    protected void Button1_Click(object sender, EventArgs e)

        Response.Write("Hello BeiJing!");

那麼這兩個函數都會執行。順序是先母版頁,後内容頁。

事件本質上是一個委托。委托這個東西,我的了解是一個函數的執行器,将函數傳給它(委托給它,+=),就會按照先後順序執行。委托就好比一支手槍,函數就好比子彈。隻要子彈尺寸口徑合适(函數的參數、類型符合聲明),不管是中國造的子彈,還是德國造的子彈,都可以打出去。給一發打一發,給兩發打兩發。

另外,通路母版頁的控件,可以通過類似(Button)Page.Master.FindControl("Button1");的方式。如果想通路母版頁的屬性,需要在内容頁加入類似一句:<%@ MasterType virtualpath="~/Master/list.master" %>

然後就可以通過 Master.屬性 的方式通路了。注意前面沒有Page.。