事件 是 C# 程式設計模型中的關鍵概念,掌握事件機制有助於深入理解 C# 程式執行流程。事件本質上是類別或物件發生特定動作,並通知其他類別或物件做出回應——這實踐了觀察者模式。
雙擊按鈕進入 Click 事件處理器:
private void button1_Click(object sender, EventArgs e)
{
// sender = 事件源,e = 事件傳遞資料
}
設計器代碼顯示註冊:
this.button1.Click += new System.EventHandler(this.button1_Click);
EventHandler 為委派型別,詳見「C# 基礎概念之委派」。
public event EventHandler myEvent;
this.myEvent += new EventHandler(MyEventHandler);
private void MyEventHandler(object sender, EventArgs e)
{
MessageBox.Show("myevent is raised.......");
}
if (myEvent != null)
{
myEvent(this.button1, new EventArgs());
}
public partial class Form1 : Form
{
public event EventHandler myEvent;
public Form1()
{
InitializeComponent();
this.myEvent += new EventHandler(MyEventHandler);
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("button1_Click");
if (myEvent != null)
{
myEvent(this.button1, new EventArgs());
}
}
private void MyEventHandler(object sender, EventArgs e)
{
MessageBox.Show("myevent is raised.......");
}
}
實務常需傳遞豐富資料,需建立繼承 EventArgs 的類別與自訂委派。
// 自訂委派
public delegate void MyEventHandler(object sender, MyEventArgs e);
public partial class AddGrade : Form
{
public event MyEventHandler myCustomEvent;
public AddGrade() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
if (myCustomEvent != null)
{
myCustomEvent(this, new MyEventArgs() { Message = this.textBox1.Text });
}
}
}
// 自訂事件資料
public class MyEventArgs : EventArgs
{
public string Message { get; set; }
}
public partial class EventDemo : Form
{
public EventDemo() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
AddGrade addGrad = new AddGrade();
addGrad.myCustomEvent += new MyEventHandler(addGrad_myCustomEvent);
addGrad.Show();
}
void addGrad_myCustomEvent(object sender, MyEventArgs e)
{
MessageBox.Show(e.Message);
}
}
!= null(object sender, EventArgs e)EventArgs 衍生類建議設計為不可變var handler = myEvent; handler?.Invoke(...)