我們在介面中設計三個按鈕,其 ID 及 Text 屬性為 Button1~Button3 ,並且提供了三個 Label 供我們顯示測試的輸出結果。
<test.aspx>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="Button1" /> <asp:Button ID="Button2" runat="server" Text="Button2" /> <asp:Button ID="Button3" runat="server" Text="Button3" /> <br /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br /> <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label> </div> </form> </body> </html><test.aspx.cs>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Button1.Click += new EventHandler(Button_Click1); Button2.Click += new EventHandler(Button_Click1); Button3.Click += new EventHandler(Button_Click1); } protected void Button_Click1(object sender, EventArgs e) { Label1.Text = "觸發 Button_Click1 事件處理程序 ((Button)sender).ID = " + ((Button)sender).ID; Label2.Text = ""; } }
test.aspx 畫面:
此範例中:
Button1 ~ Button3 代表物件
Button1.Click ~ Button3.Click 代表該物件的事件(也就是 Button 的 Click 事件)
Button_Click1 及 Button_Click2 代表事件處理程序
從程式碼中可以看得出來,我在 test.aspx 檔案中並未針對 asp:Button 標籤指定任何事件處理程序的動作(一般來其標籤會有 OnClick="Button1_Click" 類似這樣的屬性)
而是在 test.aspx 檔案的後置程式碼 (Code Behind) 的檔案中(text.aspx.cs)對 Button1~Button3 的 Click 屬性中去指定事件處理程序
Button1.Click += new EventHandler(Button_Click1); Button2.Click += new EventHandler(Button_Click1); Button3.Click += new EventHandler(Button_Click1);
new EventHandler 產生一個新的 EventHandler(事件處理程序)型別物件,建構子傳入參數 Button_Click1,以上動作也就是產生一個「指定事件處理程序為 Button_Click1 這個方法」的物件。
然後再將此 EventHandler 型態的物件透過「+= 」運算子放到指定物件(Button1~Button3)的 Click 事件屬性裡面。
這樣就可以讓 Button1 ~ Button3 的事件都統一透過 Button_Click1 這個方法去執行,呼應我們文章主題寫的,對多個控制項指定單一事件處理程序。
然後最後是我們真正工作的事件處理程序(Button_Click1 方法)
protected void Button_Click1(object sender, EventArgs e) { Label1.Text = "觸發 Button_Click1 事件處理程序 ((Button)sender).ID = " + ((Button)sender).ID; Label2.Text = ""; }
以此範例中,當按鈕按下時會觸發事件處理程序 Button_Click1,會傳入兩個參數,一個是 object 型態的物件 sender,另一個是 EventArgs 型態的物件 e
而我們可以透過傳入的 sender 來判斷觸發事件的是哪個物件
由於傳入的 sender 是 object 型態的物件,我們將其強制型別轉換成 Button 型態,才可以順利取得該物件的 ID,也就是判斷您按下的按鈕是哪一顆。
執行畫面:
至於為何要使用「+= 」而不是「=」呢?這是因為一個物件事件,可以觸發多個事件處理程序,我們加入以下程式碼
Button3.Click += new EventHandler(Button_Click2);
這樣子對 Button3 來說,當 Click 事件發生時,除了會觸發 Button_Click1 之外,還會觸發 Button_Click2 事件處理程序
執行畫面:
以下附上加入 Button_Click2 後的完整的程式碼可以自己執行看看比較清楚^^
一開始接觸時也是很多疑惑,試著將自己的學習過程記錄下來,有問題歡迎各位留言討論。
<test.aspx.cs>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Button1.Click += new EventHandler(Button_Click1); Button2.Click += new EventHandler(Button_Click1); Button3.Click += new EventHandler(Button_Click1); Button3.Click += new EventHandler(Button_Click2); } protected void Button_Click1(object sender, EventArgs e) { Label1.Text = "觸發 Button_Click1 事件處理程序 ((Button)sender).ID = " + ((Button)sender).ID; Label2.Text = ""; } protected void Button_Click2(object sender, EventArgs e) { Label2.Text = "觸發 Button_Click2 事件處理程序,((Button)sender).ID = " + ((Button)sender).ID; } }
沒有留言:
張貼留言