[C#] 事件(二)
Introduction
延伸之前 http://www.dotblogs.com.tw/atowngit/archive/2009/12/13/12418.aspx
撰寫類別物件的時候,有時候需要提供一些事件給使用者互動。
當物件要做某些動作的時候(呼叫函式),比方說儲存(DoSave)、修改(DoModify)...,有些物件會提供事件(DoSave_BeforeHandle),當有需要時可以繫結使用。
Example
方案結構如下
sample1
BaseBeforeEventArgs.cs
/// <summary>
/// 動作執行前的事件引數基底類別。
/// </summary>
abstract class BaseBeforeEventArgs : EventArgs {
private bool _Cancel = default(bool);
/// <summary>
/// 是否取消動作。
/// </summary>
public bool Cancel {
get { return _Cancel; }
set { _Cancel = value; }
}
}
BaseAfterEventArgs.cs
/// <summary>
/// 動作執行後的事件引數基底類別。
/// </summary>
abstract class BaseAfterEventArgs : EventArgs{
}
DoSaveBeforeEventArgs.cs
/// <summary>
/// DoSave_Before 事件引數。
/// </summary>
class DoSaveBeforeEventArgs : BaseBeforeEventArgs {
}
DoSaveAfterEventArgs.cs
/// <summary>
/// DoSave_After 事件引數。
/// </summary>
class DoSaveAfterEventArgs : BaseAfterEventArgs{
}
TDocumentManager.cs
class TDocumentManager {
//委派型別
public delegate void DoSaveBeforeHandle(object sender,DoSaveBeforeEventArgs e);
public delegate void DoSaveAfterHandle(object sender, DoSaveAfterEventArgs e);
//定義符合 DoSaveBeforeHandle 委派的事件
public event DoSaveBeforeHandle OnDoSaveBefore;
//定義符合 DoSaveAfterHandle 委派的事件
public event DoSaveAfterHandle OnDoSaveAfter;
public void DoSave() {
//建立事件引數物件
DoSaveBeforeEventArgs beforeArgs = new DoSaveBeforeEventArgs();
DoSaveAfterEventArgs afterArgs = new DoSaveAfterEventArgs();
//呼叫 OnDoSaveBefore 事件
OnDoSaveBefore(this, beforeArgs);
//判斷是否取消動作,若確定取消動作,則離開函式
if (beforeArgs.Cancel) {
Console.WriteLine("取消作業");
return ;
}
//處理 Save 動作
string sResult = this.ProcessSave();
//印出結果
Console.WriteLine(sResult);
//呼叫 OnDoSaveBefore 事件
OnDoSaveAfter(this, afterArgs);
}
private string ProcessSave() {
return "執行 ProcessSave ";
}
}
Program.cs
class Program {
static void Main(string[] args) {
//建立物件
TDocumentManager oTDocumentManager = new TDocumentManager();
//繫結事件
oTDocumentManager.OnDoSaveBefore += new TDocumentManager.DoSaveBeforeHandle(oTDocumentManager_OnDoSaveBefore);
oTDocumentManager.OnDoSaveAfter += new TDocumentManager.DoSaveAfterHandle(oTDocumentManager_OnDoSaveAfter);
//呼叫儲存函式
oTDocumentManager.DoSave();
Console.ReadKey();
}
// DoSaveAfter 事件
static void oTDocumentManager_OnDoSaveAfter(object sender, DoSaveAfterEventArgs e) {
Console.WriteLine("oTDocumentManager_OnDoSaveAfter");
}
//OnDoSaveBefore 事件
static void oTDocumentManager_OnDoSaveBefore(object sender, DoSaveBeforeEventArgs e) {
//e.Cancel = true;
Console.WriteLine("oTDocumentManager_OnDoSaveBefore");
}
}
執行結果
sample2 在 OnDoSaveBefore 事件中取消作業
//OnDoSaveBefore 事件
static void oTDocumentManager_OnDoSaveBefore(object sender, DoSaveBeforeEventArgs e) {
e.Cancel = true;
Console.WriteLine("oTDocumentManager_OnDoSaveBefore");
}
執行結果
程式碼下載 DemoEvents.rar
三小俠 小弟獻醜,歡迎指教