**:
本文分析了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這是我們和button1_click事件所對應的方法。注意方法的引數符合委託中的簽名(既引數列表)。那我們怎麼把這個方法和事件聯絡起來呢,請看下面的**。void button1_click(object sender, system.eventargs e)
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此**不斷的要求使用者輸入字元,如果輸入的結果是h,則觸發onuserrequest事件,事件的觸發者是本身(this),事件細節無(沒有傳遞任何引數的eventargs例項)。我們給這個類取名為userinputmonitor。void run()
}while(!finished);
}
下面我們要做的是定義客戶端的類
首先得例項化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;c#事件處理:進一步研究c#中的預定義事件處理機制class userinputmonitor
}while(!finished);
} }
public
class client
private
void showmessage(object sender,eventargs e)
client(userinputmonitor m)
}
可能大家發現在c#中有些事件和前面的似乎不太一樣。例如
private這裡使用了keypresseventargs而不是eventargs作為引數。這裡使用了keyeventhandler委託,而不是eventhandler委託。void textbox1_keypress(object sender, system.windows.forms.keypresseventargs e)
this.textbox1.keypress+=newsystem.windows.forms.keypresseventhandler(this.textbox1_keypress);
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;因為現在要監聽多個鍵了,我們得改寫***的類中的do...while部分。改寫委託,改寫客戶端傳遞的引數。好了最終**如下,好累class mymyeventargs:eventargs
public
char keychar
} }
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...