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



沒有留言:

張貼留言