2016年6月21日 星期二
[ C# ] 建立自己要的Event 事件
在VB可以直接建立 Event 然後透過 RaiseEvent 觸發
可是在C#沒辦法這樣直接建立,必須透過 delegate(委派),在建立Event(事件)
有時候常常會把自己比較常操作的東西
或是針對某個服務的操作寫成一個自己的Class
例如對資料庫的操作包成一個Class
在Class裡面的一些操作如果有 錯誤該怎麼處理呢
剛開始我都是用回傳值的方式,然後使用時用 if 判斷回傳值
例如:
我要寫一個 Class mSQL 裡面提供了Open()來做資料庫連線,我是寫這樣
public string Open() {
try {
sql.connation();
} catch (Exception ex) {
return ex.Message
}
}
然後再使用的時候去判斷 Open()這個涵式的回傳值是否為空白
if(mSQL.Open != "") .....
不過這樣寫其實很麻煩,而且很像也不是很好,所以後來就改用Event事件的方式
順便記錄一下遇到的小問題
程式碼其實沒什麼 簡單幾串而已
不過一開始完全沒有頭緒對委派又不董是要幹嗎,東找西找終於找到怎麼寫
宣告方式,先宣告delegate 並設定參數,接著宣告 Event 事件
public delegate void ErrorDelegate(int Code, string Message);
public event ErrorDelegate ErrorEvent;
使用上只要直接呼叫就可以了
if(ErrorEvent!= null)
ErrorEvent(-1,"SQL Connation Error!!");
之前發生的問題在於 沒有加這個出現錯誤 if(ErrorEvent!= null)
為什麼ErrorEvent會是 null呢
原來是使用著沒有建立 ErrorEvent 這個事件處理
什麼意思????
當我在 Class 建立好 Event 事件之後
主程式呼叫 這個Class的時候沒有建立 ErrorEvent 的處理事件
當程式執行 ErrorEvent(-1,"SQL Connation Error!!");
這個時候就會跳出 Exception 出來
所以主程式加上
MyClass.ErrorEvent += MyClass_ErrorEvent;
private void myPLC_ErrorEvent(int Code, string Message) {
// Do Something.....
}
比較完整的程式碼大概是這樣
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
Myclass mMyclass = new Myclass();
//--下面兩行位置互換就會發生剛剛說的錯誤--
//主程式建立ErrorEvent 的 EventHolder 來處立處發時的動作
mMyclass.ErrorEvent += mMyclass_ErrorEvent;
//觸發Event事件
mMyclass.Doevent();
}
void mMyclass_ErrorEvent(int Code, string Message) {
//當ErrorEvent觸發時顯示錯誤訊息
MessageBox.Show(Message);
}
public class Myclass{
//宣告Event事件
public delegate void ErrorDelegate(int Code, string Message);
public event ErrorDelegate ErrorEvent;
public void Doevent(){
/*
* 這邊是直接觸發ErrorEvent
* 正常開發可以加入自己的羅疑判斷後觸發
*/
ErrorEvent(1,"Error發生觸發Event!!");
}
}
}
之前一值不懂為什麼會跳這個錯誤,查看錯誤詳細資料又寫
{"並未將物件參考設定為物件的執行個體。"}
剛好主程式的 MyClass.ErrorEvent += MyClass_ErrorEvent;
寫在某些Event觸發事件之後,然後就有時候會出現錯誤
有時候沒有錯誤可以正常觸發.....
之前在 微軟論壇上發問 對於EventArgs 使用還不是很懂
所以就先用這個方式用吧!!~~
關於 delegate 跟 event 詳細的介紹 參考 參考2
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言