[C#] 事件(二)

  • 11735
  • 0

[C#] 事件(二)

Introduction

延伸之前 http://www.dotblogs.com.tw/atowngit/archive/2009/12/13/12418.aspx

撰寫類別物件的時候,有時候需要提供一些事件給使用者互動。

當物件要做某些動作的時候(呼叫函式),比方說儲存(DoSave)、修改(DoModify)...,有些物件會提供事件(DoSave_BeforeHandle),當有需要時可以繫結使用。

 

Example

方案結構如下

2010-01-13_211923

 

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");
        }
    }

 

執行結果

 

2010-01-13_212756

 

 

sample2 在 OnDoSaveBefore 事件中取消作業

 


//OnDoSaveBefore 事件
        static void oTDocumentManager_OnDoSaveBefore(object sender, DoSaveBeforeEventArgs e) {
            e.Cancel = true;
            Console.WriteLine("oTDocumentManager_OnDoSaveBefore");
        }

 

執行結果

2010-01-13_213511

 

程式碼下載 DemoEvents.rar

三小俠  小弟獻醜,歡迎指教