狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

淺析C#的事件處理與自定義事件

淺析C#的事件處理與自定義事件

更新時間:2019-05-15 文章作者:未知 信息來源:網絡 閱讀次數:

一、了解C#中的預定義事件處理機制

    在寫代碼前我們先來熟悉.net框架中和事件有關的類和委托,了解C#中預定義事件的處理。

    EventArgs是包含事件數據的類的基類,用于傳遞事件的細節。

    EventHandler是一個委托聲明如下

         public delegate void EventHandler( object sender , EventArgs e )

    注意這里的參數,前者是一個對象(其實這里傳遞的是對象的引用,如果是button1的click事件則sender就是button1),后面是包含事件數據的類的基類。

    下面我們研究一下Button類看看其中的事件聲明(使用WinCV工具查看),以Click事件為例。

         public event EventHandler Click;

    這里定義了一個EventHandler類型的事件Click

    前面的內容都是C#在類庫中已經為我們定義好了的。下面我們來看編程時產生的代碼。

        private void button1_Click(object sender, System.EventArgs e)
        {
            ...
        }

    這是我們和button1_click事件所對應的方法。注意方法的參數符合委托中的簽名(既參數列表)。那我們怎么把這個方法和事件聯系起來呢,請看下面的代碼。

        this.button1.Click += new System.EventHandler(this.button1_Click);

    把this.button1_Click方法綁定到this.button1.Click事件。

    下面我們研究一下C#事件處理的工作流程,首先系統會在為我們創建一個在后臺監聽事件的對象(如果是button1的事件那么監聽事件的就是button1),這個對象用來產生事件,如果有某個用戶事件發生則產生對應的應用程序事件,然后執行訂閱了事件的所有方法。

二、簡單的自定義事件(1)

    首先我們需要定義一個類來監聽客戶端事件,這里我們監聽鍵盤的輸入。

    定義一個委托。

        public delegate void UserRequest(object sender,EventArgs e);

    前面的object用來傳遞事件的發生者,后面的EventArgs用來傳遞事件的細節,現在暫時沒什么用處,一會后面的例子中將使用。

    下面定義一個此委托類型類型的事件

        public event UserRequest OnUserRequest;

    下面我們來做一個死循環

        public void Run()      {      bool finished=false;      do      {       if (Console.ReadLine()=="h")       {        OnUserRequest(this,new EventArgs());       }        }while(!finished);      }

    此代碼不斷的要求用戶輸入字符,如果輸入的結果是h,則觸發OnUserRequest事件,事件的觸發者是本身(this),事件細節無(沒有傳遞任何參數的EventArgs實例)。我們給這個類取名為UserInputMonitor。

   下面我們要做的是定義客戶端的類
    首先得實例化UserInputMonitor類
       UserInputMonitor monitor=new UserInputMonitor();

    然后我們定義一個方法。

       private void ShowMessage(object sender,EventArgs e)
      {
          Console.WriteLine("HaHa!!");
      }

     最后要做的是把這個方法和事件聯系起來(訂閱事件),我們把它寫到庫戶端類的構造函數里。

     Client(UserInputMonitor m)
     {
      m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
      //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);

      //注意這種寫法是錯誤的,因為委托是靜態的

     }

     下面創建客戶端的實例。

         new Client(monitor);

     對了,別忘了讓monitor開始監聽事件。

        monitor.run();

     大功告成,代碼如下:

using System;class UserInputMonitor{ public delegate void UserRequest(object sender,EventArgs e); //定義委托 public event UserRequest OnUserRequest; //此委托類型類型的事件 public void Run() {  bool finished=false;  do  {   if (Console.ReadLine()=="h")   {    OnUserRequest(this,new EventArgs());   }    }while(!finished); }}
   
public class Client{ public static void Main() {  UserInputMonitor monitor=new UserInputMonitor();  new Client(monitor);  monitor.Run(); } private void ShowMessage(object sender,EventArgs e) {  Console.WriteLine("HaHa!!"); } Client(UserInputMonitor m) {  m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);  //注意這種寫法是錯誤的,因為委托是靜態的 }}
三、進一步研究C#中的預定義事件處理機制

    可能大家發現在C#中有些事件和前面的似乎不太一樣。例如

      private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
      {

      }

      this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);

    這里使用了KeyPressEventArgs而不是EventArgs作為參數。這里使用了KeyEventHandler委托,而不是EventHandler委托。

    KeyPressEventArgs是EventArgs的派生類,而KeyEventHandler的聲明如下

      public delegate void KeyEventHandler( object sender , KeyEventArgs e );

   是參數為KeyEventArgs的委托。那為什么KeyPress事件要這么做呢,我們可以從兩個類的構造函數來找答案。

       public EventArgs();

       public KeyPressEventArgs(char keyChar);

    這里的keyData是什么,是用來傳遞我們按下了哪個鍵的,哈。

    我在KeyEventArgs中又發現了屬性

       public char KeyChar { get; }

    進一步證明了我的理論。下面我們來做一個類似的例子來幫助理解。

四、簡單的自定義事件(2)

    拿我們上面做的例子來改。

    我們也定義一個EventArgs(類似KeyEventArgs)取名MyEventArgs,定義一個構造函數public MyEventArgs(char keyChar),同樣我們也設置相應的屬性。代碼如下

using System;class MyMyEventArgs:EventArgs{ private char keyChar; public MyMyEventArgs(char keyChar) {  this.keychar=keychar; } public char KeyChar {  get  {   return keyChar;  } }}

因為現在要監聽多個鍵了,我們得改寫監聽器的類中的do...while部分。改寫委托,改寫客戶端傳遞的參數。好了最終代碼如下,好累

using System;class MyEventArgs:EventArgs{ private char keyChar; public MyEventArgs(char keyChar) {  this.keyChar=keyChar; } public char KeyChar {  get  {   return keyChar;  } }}
 
class UserInputMonitor{ public delegate void UserRequest(object sender,MyEventArgs e); //定義委托 public event UserRequest OnUserRequest; //此委托類型類型的事件 public void Run() {  bool finished=false;  do  {   string inputString= Console.ReadLine();   if (inputString!="")     OnUserRequest(this,new MyEventArgs(inputString[0]));  }while(!finished); }}
 
public class Client{ public static void Main() {  UserInputMonitor monitor=new UserInputMonitor();  new Client(monitor);  monitor.Run(); } private void ShowMessage(object sender,MyEventArgs e) {  Console.WriteLine("捕捉到:{0}",e.KeyChar); } Client(UserInputMonitor m) {  m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);  //注意這種寫法是錯誤的,因為委托是靜態的 }}
 

本人水平有限,所以錯誤難免,極其歡迎大家批評指正。

renrenqq(ddlly)     EMail: ddlly@tom.com,    QQ24008122

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
国产精品一区二区你懂的| 午夜在线精品偷拍| 不卡一区二区三区四区| 国产老女人精品毛片久久| 九九九精品视频| 久久精品国产一区二区三区免费看| 亚洲福利一二三区| 奇米在线7777在线精品| 久久97超碰色| 从欧美一区二区三区| 成人av综合在线| 欧美日韩一区二区视频在线| 欧美日韩在线大尺度| 一区免费在线| 国产精品亚洲欧美| 日本久久一区二区三区| 欧美嫩在线观看| 久久久久久久综合| 国产精品免费久久久久| 亚洲一区二区精品久久av| 日韩不卡一二三区| 国产精品中文字幕欧美| 欧美凹凸一区二区三区视频| 好吊色欧美一区二区三区四区| 国产日韩一区二区三区在线播放| 蜜桃久久精品乱码一区二区| 欧美日韩精品久久久| 久久免费偷拍视频| 亚洲免费观看高清| 久久机这里只有精品| 99久久精品国产导航| 亚洲精品日韩久久| 欧美日韩国产小视频在线观看| 欧美成人a在线| 亚洲免费在线观看视频| 久久电影网站中文字幕 | 国模精品一区二区三区| 国产日韩欧美一区二区| 欧美精品v日韩精品v韩国精品v| wwwwxxxxx欧美| 亚洲一区二区精品久久av| 国产一区二区三区蝌蚪| 欧美高清日韩| 欧美三级三级三级爽爽爽| 国产拍揄自揄精品视频麻豆| 亚洲不卡av一区二区三区| 国产成人亚洲精品青草天美 | 51精品秘密在线观看| 国产精品午夜久久| 久久精品国产久精国产| 国内一区二区三区| 欧美日本一区二区三区| 中文字幕五月欧美| 国产传媒欧美日韩成人| 亚洲一区二区动漫| 久久人人97超碰com| 日韩av不卡在线观看| 亚洲天堂激情| 精品欧美乱码久久久久久| 亚洲韩国一区二区三区| 欧美一区二区| 欧美一区二区久久| 亚洲r级在线视频| 国产自产在线视频一区| 日韩一区二区三区视频在线观看| 亚洲制服丝袜av| 欧美日韩精品免费观看视一区二区| 欧美日韩一区二区在线视频| 亚洲精品国产一区二区精华液| 成人午夜视频在线| 欧美亚洲禁片免费| 亚洲一区二区三区四区在线观看 | 日韩女同互慰一区二区| 日韩一区欧美二区| 最新日韩av| 欧美国产亚洲另类动漫| 成人爱爱电影网址| 69堂成人精品免费视频| 石原莉奈一区二区三区在线观看 | www激情久久| 国产老妇另类xxxxx| 欧洲精品在线观看| 亚洲成人av福利| 国产欧美一区二区三区另类精品| 日本一区二区不卡视频| 99re6这里只有精品视频在线观看| 欧美日韩国产高清一区二区| 性感美女极品91精品| 99热这里只有精品8| 国产精品久久精品日日| 99精品偷自拍| 久久嫩草精品久久久精品| 成人激情动漫在线观看| 欧美成人aa大片| eeuss鲁片一区二区三区在线观看| 日韩一区二区三区在线观看| 国产麻豆欧美日韩一区| 欧美日韩国产经典色站一区二区三区 | 国产精品视频你懂的| 欧美激情一区| 国产精品久久影院| 一区二区视频在线观看| 亚洲视频在线观看一区| 激情视频一区二区| 亚洲黄色小视频| 免费亚洲视频| 免费成人在线网站| 欧美日韩国产精品成人| 国产a久久麻豆| 久久综合成人精品亚洲另类欧美| 99久久久国产精品免费蜜臀| 久久精品一区蜜桃臀影院| 女女同性精品视频| 最新热久久免费视频| 国产精品久久久对白| 日韩高清在线观看| 这里只有精品99re| 99re66热这里只有精品3直播| 久久精品视频在线看| 极品av少妇一区二区| 亚洲午夜国产一区99re久久| 色婷婷av一区| 国产91精品入口| 国产精品日日摸夜夜摸av| 国产精品久久波多野结衣| 欧美a一区二区| 日韩欧美一级特黄在线播放| 欧美日韩国产精品一区二区亚洲| 亚洲精品国产一区二区精华液 | 亚洲黄色大片| 卡一卡二国产精品| 久久蜜桃香蕉精品一区二区三区| 怡红院精品视频在线观看极品| 亚洲一区二区三区美女| 欧美在线免费播放| 91欧美一区二区| 艳妇臀荡乳欲伦亚洲一区| 欧美精品视频www在线观看| 91在线精品秘密一区二区| 一区二区三区丝袜| 欧美巨大另类极品videosbest | 日韩一二三区不卡| 91久久国产综合久久蜜月精品| 蜜臀91精品一区二区三区| 久久九九全国免费| 久久精品国产清高在天天线 | 99精品视频在线免费观看| 亚洲一区二区在线免费看| 欧美一区二区日韩一区二区| 亚洲一级一区| 国产一区二区三区精品欧美日韩一区二区三区 | 日本道精品一区二区三区| 欧美99在线视频观看| 蜜桃av一区二区在线观看| 国产精品成人免费精品自在线观看| 久久在线精品| 欧美日韩亚洲一区在线观看| 久久精品久久99精品久久| 亚洲欧洲av在线| 欧美一卡二卡三卡四卡| 亚洲一区二区在| 午夜国产欧美理论在线播放| 精品影院一区二区久久久| 亚洲精品国产一区二区三区四区在线 | 日本黄色一区二区| 黄色成人av网站| 成人av电影免费观看| 蜜臀av性久久久久蜜臀aⅴ | 精品9999| www.在线欧美| 国产一区二区福利视频| 亚洲一级二级三级在线免费观看| 久久久久久久久伊人| 91精品在线麻豆| 欧美系列亚洲系列| 久久激情久久| 国产视频一区在线观看一区免费| 女同性一区二区三区人了人一| 国产真实乱偷精品视频免| 亚洲va中文字幕| 亚洲另类一区二区| 国产精品久久综合| 国产欧美va欧美不卡在线| 亚洲午夜视频在线观看| 久久久另类综合| 精品国产欧美一区二区| 88在线观看91蜜桃国自产| 欧美性受极品xxxx喷水| 91久久人澡人人添人人爽欧美| 在线视频一区观看| 99xxxx成人网| 亚洲精品美女| 在线亚洲精品| 一区二区国产精品| 国产情侣久久| 一区二区av| 久久aⅴ国产紧身牛仔裤| 亚洲一区成人| 在线欧美小视频| 欧美亚洲国产怡红院影院|