在事件處理方法中,類似下面這種形式
private void Button_Click(object sender, EventArgs e)
總是有2個參數,object類型的,EventArgs或者繼承於EventArgs的參數,他們的代表的意思分表是:
object sender 發出事件的對象
System.EventArgs e 對象中的數據
以Button為例:
protected void Button1_Click(object sender, EventArgs e)
其中的sender,就是你點擊的button.可以通過類型轉換得到這個button的引用:
Button sendButton = (Button)sender;
e是你點擊事件的一些參數。在某些事件里,e用處不大,比如在MouseEventArgs的Mouse事件中,可以看到e包括mouse的坐標值等,以供你的程序使用。
自定義事件:
在MSDN中是這么描述的:
類或對象可以通過事件向其他類或對象通知發生的相關事情。 發送(或引發)事件的類稱為“發行者”,接收(或處理)事件的類稱為“訂戶”
事件具有以下特點:
- 發行者確定何時引發事件,訂戶確定執行何種操作來響應該事件。
- 一個事件可以有多個訂戶。 一個訂戶可處理來自多個發行者的多個事件。
- 沒有訂戶的事件永遠也不會引發。
- 事件通常用於通知用戶操作,例如,圖形用戶界面中的按鈕單擊或菜單選擇操作。
- 如果一個事件有多個訂戶,當引發該事件時,會同步調用多個事件處理程序。 要異步調用事件,請參見使用異步方式調用同步方法。
- 在 .NET Framework 類庫中,事件是基於 EventHandler 委托和 EventArgs 基類的。
事件是類和對象向外界發出的消息,事件的執行是通過事件【委托】的方式,調用我們所准備好的處理方法。要響應某些事件並針對某些事件執行我們指定的方法,需要做到以下幾步:
- 聲明委托、事件
- 添加事件的觸發方法,也就是通知接受者方法
- 添加事件引發方法
- 接受者處本地化響應方法
- 接受者訂閱事件
在vs2003中觸發一個Button事件一般是這么寫
this.btnAdd.Click += new System.EventHandler(this. btnAdd _Click);
示例代碼:
using System;
namespace ConsoleApplication1
{
//定義delegate
public delegate void myEventHandler(object sender, myEventArgs e);
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入一個名字,按enter");
string s=Console.ReadLine();
KeyPressEvent source = new KeyPressEvent();
KeyPressListener listener = new KeyPressListener(source);//初始化時訂閱事件
myEventArgs argument=new myEventArgs();
argument.name=s;
source.DidInput(argument);
//取消訂閱
Console.WriteLine("取消監聽事件(訂閱),按enter");
Console.ReadLine();
listener.detach();//取消監聽(訂閱)
Console.WriteLine("已經取消了監聽事件");
Console.WriteLine("請再次輸入一個名字,按enter");
string s2 = Console.ReadLine();
myEventArgs argument2 = new myEventArgs();
argument2.name = s2;
source.DidInput(argument2);
Console.ReadLine();
}
}
//定義事件參數類
public class myEventArgs : EventArgs
{
public string myArgument {
get{ return "我是參數";}
}
public string name { get; set; }
}
//事件發行者
class KeyPressEvent {
public event myEventHandler OnKeyPress;// 用event 關鍵字聲明事件對象
//修飾符 virtual則是保證在控制訪問修飾符的前提下保證可繼承並支持重寫事件觸發方法
public virtual void DidInput(myEventArgs e)//事件觸發的方法
{
if (OnKeyPress != null)
{
OnKeyPress(this, e);
}
}
}
//監聽者(訂閱者)
class KeyPressListener {
private KeyPressEvent keyPressEvent;
// 構造方法,訂閱事件
public KeyPressListener(KeyPressEvent evenSource)
{
keyPressEvent = evenSource;
//keyPressEvent.OnKeyPress+=keyPressEvent_OnKeyPress;
keyPressEvent.OnKeyPress += new myEventHandler(keyPressEvent_OnKeyPress);
}
private void keyPressEvent_OnKeyPress(object sender, myEventArgs e)
{
Console.WriteLine(string.Format("觸發了。。{0}--{1} and name={2}",sender,e.myArgument,e.name));
}
//取消訂閱事件
public void detach()
{
keyPressEvent.OnKeyPress -= keyPressEvent_OnKeyPress;
}
}
}
