C 事件處理和自定義事件

2021-06-27 08:55:58 字數 3811 閱讀 9070

**:

本文分析了c#中事件處理並且舉例自定義事件。首先我們需要定義乙個類來監聽客戶端事件,這裡我們監聽鍵盤的輸入。

c#事件處理:了解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),這個物件用來產生事件,如果有某個使用者事件發生則產生對應的應用程式事件,然後執行訂閱了事件的所有方法。

c#事件處理:簡單的自定義事件(1)

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

定義乙個委託。

public delegate void userrequest(object sender,eventargs e);

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

下面定義乙個此委託型別型別的事件

public event userrequest onuserrequest;

下面我們來做乙個死迴圈

public

void run()       

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

下面建立客戶端的例項。

new client(monitor);

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

monitor.run();

大功告成,**如下:

using system;  

class userinputmonitor  

}while(!finished);  

}  }  

public

class client  

private

void showmessage(object sender,eventargs e)  

client(userinputmonitor m)  

c#事件處理:進一步研究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

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

簡單的自定義事件(2)

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

我們也定義乙個eventargs(類似keyeventargs)取名myeventargs,定義乙個建構函式public myeventargs(char keychar),同樣我們也設定相應的屬性。**如下

using system;  

class mymyeventargs:eventargs  

public

char keychar  

}  }

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

using system;  

class myeventargs:eventargs  

public

char keychar  

}  }  class userinputmonitor  

while(!finished);  

}  }  

public

class client  

private

void showmessage(object sender,myeventargs e)  

",e.keychar);  

}  client(userinputmonitor m)  

C 自定義事件處理

一 事件不具有特定資料的事件定義 1 在類中定義公共事件成員 public event eventhandler myevent 2 在引發事件的類中提供乙個受保護的方法 protected virtual void onmyevent eventargs e 二 事件具有特定資料的事件定義 你知道...

C 事件 自定義事件

事件有很多,比如說 滑鼠的事件 mousermove,mouserdown等。鍵盤的事件 keyup,keydown,keypress。有事件,就會有對事件進行處理的方法,而事件和處理方法之間是怎麼聯絡起來的呢?委託就是他們中間的橋梁,事件發生時,委託會知道,然後將事件傳遞給處理方法,處理方法進行相...

VB中自定義事件和事件處理

乙個包含事件的類 clswithevents clswithevents類中,有兩個屬性width和height,這兩個屬性改變時會分別觸發對應的changed事件。在 public event 宣告了兩個事件委託的原型 public class clswithevents private mwid...