為自訂控制項添加自訂事件

來源:互聯網
上載者:User

  事件,委託,總是看起來有點繞,不過本文不介紹這些,只說說如何為自訂控制項添加自訂事件。

  本文所說的自訂控制項,非繼承其他現有Microsoft控制項或者群組控制項,而是完全繼承UserControl的東西。

  既然不是繼承自其他現有控制項或者控制群組合,在特定需求下,有添加自訂事件的可能性,或者對繼承自UserControl而得到的事件進行些許擴充,以期以簡便的方式得到更豐富的資訊等等。

  下面簡單介紹2個例子,有用之人作為參考,大拿層級的,ignore吧。

  例1. 添加完全自訂事件。

  需求:

  假設用戶端(指添加了自訂控制項的表單等等)想知道使用者是否在控制項上按下的Shift鍵(當然,可以通過KeyPress之類的事件來判斷,沒必要再自己整個事件,例子只是個例子),控制項作者想通過一個特殊的方式來進行判斷,這就可以選擇自訂事件。

  好吧,起個名字,叫Custom,需要用戶端在觸發Custom時得到一個布爾屬性Flag來判斷使用者是否按下Shift。

  按部就班:

  (1)建立事件

        // 建立事件
        public event CustomEventHandler Custom;

  有問題,CustomEventHandler是什麼,當然,這裡需要一個委託,於是還是搞定這個委託

  (2)定義委託

    // 定義委託
    public delegate void CustomEventHandler(object sender, CustomEventArgs e);

  CustomEventHandler搞定了,又有新問題:CustomEventArgs是啥,其實需要CustomEventArgs來獲得你需要的資料,CustomEventHandler,於是還要定義個CustomEventArgs(這個東西必須繼承自System.EventArgs),在CustomEventArgs裡面定義需要的資料屬性:
(3)定義EventArgs

    // 自訂EventArgs,並添加自訂屬性【Flag】
    public sealed class CustomEventArgs : EventArgs
    {
        private bool testFlag;
        public CustomEventArgs(bool testFlag)
        {
            this.testFlag = testFlag;
        }
        public bool Flag
        {
            get { return testFlag; }
        }
    }

  有了CustomEventArgs,以後在觸發事件之後便可以從e.Flag中得到資料。

  事件定義完了,這下看看效果先:

  圖片看不清楚?請點擊這裡查看原圖(大圖)。

  能看到在屬性視窗中已經能見到Custom事件

  可是Custom到底是怎麼執行和在控制項內部觸發的呢,想破頭~

  (4)執行事件的代碼

  需要一個OnCustom來完成任務

       // 執行事件
        protected virtual void OnCustom(CustomEventArgs e)
        {
            if (Custom != null)
            {
                Custom(this, e);
            }
        }
 
Custom(this, e);

 

  來完成調動用戶端的任務,現在問題的關鍵就在於在合適的地方執行一下OnCustom就可以了,在何處執行,全看你需要的資料在什麼地方能後取得或者發生變化,本例簡單點,就在控制項本身的KeyDown事件裡面好了:

  (5)何處執行OnCustom

        // 觸發事件處
        private void MyControl_KeyDown(object sender, KeyEventArgs e)
        {
            // 此處省略無關代碼。。。
 
            // 用戶端按下Shift鍵與否
            bool testFlag = e.Shift;
            CustomEventArgs eArgs = new CustomEventArgs(testFlag);
            // 觸發事件
            OnCustom(eArgs);
 
            // 此處省略無關代碼。。。
        }

  至此算基本完成,看下最終效果:

  圖片看不清楚?請點擊這裡查看原圖(大圖)。

  在測試表單上使用自訂控制項的Custom事件

  例2.對原有事件進行一定擴充,並覆蓋原事件

  需求:

  想在KeyPress中再多獲得一些資料,起個名字:KeyAscii,但是KeyPress中沒有這個,那就自訂一個CustomKeyPress,不用KeyPress,並使其在用戶端隱藏

  隱藏的辦法:

        // 屏蔽KeyPress事件使其在用戶端不可見
        [Browsable(false)]
        public new event KeyPressEventHandler KeyPress;

 以後跟例一差不多了,

  建立事件,委託:

        // 建立事件CustomKeyPress替代KeyPress
        public event CustomKeyPressEventHandler CustomKeyPress;
    // 定義委託
    public delegate void CustomKeyPressEventHandler(object sender, CustomKeyPressEventArgs e);
CustomKeyPressEventArgs要繼承自KeyPressEventArgs,而System.Windows.Forms.KeyPressEventArgs其實繼承自System.EventArgs
   // 自訂KeyPressEventArgs,並添加自訂屬性【KeyAscii】
    public sealed class CustomKeyPressEventArgs : KeyPressEventArgs
    {
        private Int32 keyAscii;
        public CustomKeyPressEventArgs(Int32 keyAscii) : base((char)keyAscii)
        {
            this.keyAscii = keyAscii;
        }
        public Int32 KeyAscii
        {
            get { return keyAscii; }
        }
    }

  觸發事件處:

        // 觸發事件處
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (CustomKeyPress != null)
            {
                CustomKeyPressEventArgs eArgs = new CustomKeyPressEventArgs(e.KeyChar);
                CustomKeyPress(this, eArgs);
            }
            base.OnKeyPress(e);
        }

 

  需要特別注意的是,KeyPress被隱藏之後,控制項本身的KeyPress事件也將不能被觸發

  OK....

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.