日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C#自定義事件步步通

做windows編程總要想辦法處理事件,例如捕捉按鈕的雙擊事件、處理菜單項(xiàng)的單擊事件、對(duì)Label上的鼠標(biāo)的移動(dòng)作出反映等。但是怎樣在自定義的控件中創(chuàng)建自定義的事件呢?通過這篇文章,你將學(xué)會(huì)怎樣使用觀察者模式(Observer design pattern )激發(fā)并處理 .NET 控件的事件,學(xué)習(xí)C#自定義事件,并學(xué)會(huì)傳遞事件參數(shù)。

事件是對(duì)象發(fā)出的消息,它通知其它對(duì)象動(dòng)作的發(fā)生。動(dòng)作可以是用戶激發(fā)的,如鼠標(biāo)點(diǎn)擊,也可以由一些程序邏輯激發(fā)。產(chǎn)生事件的對(duì)象稱為事件發(fā)送者,接受事件通知的對(duì)象稱為事件接收者。事件接收者有能夠?qū)κ录鞒龇从车姆椒ā?/p>

.NET Framework 能夠很容易地實(shí)現(xiàn)事件驅(qū)動(dòng)的window編程。程序開發(fā)人員無需了解.NET的事件是 如何工作的。我們需要記住的是:如果你想要從window控件獲取事件,你提供一Event Handler,然后將它注冊(cè)到事件源,這就是事件編寫。在C#中,語(yǔ)法如下,通常都寫在Form的構(gòu)造方法中。

 
 
 
  1. eventSource.someEvent += new SomeEventHandler(someMethod);

以處理button1控件的Click事件為例,但Click事件發(fā)生時(shí)將執(zhí)行button1_Clicked方法。你可以這樣寫:

 
 
 
  1. button1.click+=new EventHandler(button1_Clicked);

然后button1_Clicked方法的實(shí)現(xiàn)如下:

 
 
 
  1. private void button1_Clicked(Object sender,EventArgs e) 
  2.     //code to be executed when the Click event occurs 
  3. }

這個(gè)方法并非必須為private,但是它必須接受兩個(gè)參數(shù):一個(gè)是Object 對(duì)象,另一個(gè)是EventArgs 對(duì)象。所以我們可以假設(shè)事件是一塊蛋糕。接下來我門來看看怎樣創(chuàng)建自定義事件以讓其它程序員來使用。在這之前,我們來討論對(duì)象編程中的觀察者模式。

觀察者模式(Observer Pattern)

觀察者模式有兩個(gè)重要的對(duì)象:觀察主體和觀察者。每個(gè)觀察主體有一到多個(gè)觀察者。這些觀察者監(jiān)聽來自觀察主題狀態(tài)變化的通知。觀察者模式也叫做依賴模式或發(fā)布—訂閱模式。四人幫(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)在他們寫的《Design Patterns:Elements of Reusable Object-Oriented Software》書中提到觀察者模式可以應(yīng)用在以下幾種場(chǎng)合:

一個(gè)抽象有兩個(gè)方面,這兩個(gè)方面彼此依賴。將這兩個(gè)方面封裝在不同的對(duì)象中,這樣你就可以獨(dú)立地修改和重用它們。

一個(gè)對(duì)象的改變需要改變其它對(duì)象,并且有多少對(duì)象需要隨之改變未知。

一個(gè)對(duì)象需要通知其它對(duì)象,但并不知道要通知哪些對(duì)象。換言之,你并不希望這些對(duì)象被緊緊地捆綁在一起。

事件通信時(shí),事件發(fā)生者并不知道哪些對(duì)象或方法將收到市靜安發(fā)生的通知,它只是持有與簽名符合的方法的引用。代理相當(dāng)于類項(xiàng)安全的函數(shù)指針或者回調(diào)。接下來我們將解釋怎樣使用代理來傳遞事件消息。再然后我們將通過一個(gè)擁有兩個(gè)自定義控件的例子將理論應(yīng)用于實(shí)際。

c#自定義事件步步通

假定你要為自定義控件MyControl寫自定義事件MyEvent,其中MyControl擴(kuò)展自System.Windows.Forms.UserControl。以下是關(guān)鍵步驟:

1.  聲明公有的delegate,這里我們命名為MyEventHandler。MyEventHandler有兩個(gè)參數(shù)。Object對(duì)象sender和MyEventArgs對(duì)象e。關(guān)于MyEventArgs我們將在后面定義。需要注意的是delegate必須聲明在你的自定義控件之外。

 
 
 
  1. public delegate void MyEventHandler(object sender,MyEventArgs e); 
  2. public class MyControl:UserControl 
  3.     …… 

2.  1中的MyEventArgs是這樣一個(gè)對(duì)象,它持有由事件發(fā)生者傳遞給事件接收者的數(shù)據(jù)。MyEventArgs必須繼承自System.EventArgs。這時(shí)的代碼如下:

 
 
 
  1. public class MyEventArgs:System.EventArgs 
  2.     …… 
  3. public delegate void MyEventHandler(object sender,MyEventArgs e); 
  4. public class MyControl:UserControl 
  5.     …… 

需要在MyEventArgs類中寫一些具體實(shí)現(xiàn)。這一點(diǎn)我們會(huì)在以后講到。

3.  在自定義控件類中,聲明一個(gè)事件,聲明為MyEvent。

 
 
 
  1. public class MyEventArgs:System.EventArgs 
  2.     …… 
  3. public delegate void MyEventHandler(object sender,MyEventArgs e); 
  4. public class MyControl:UserControl 
  5.     public event MyEventHandler MyEvent; 
  6.     …… 

4.  在自定義控件類中,聲明受保護(hù)的虛方法,命名規(guī)則是在事件名字的前面加上On。既然我們的事件命名為MyEvent,那么這個(gè)方法就叫做OnMyevent。OnMyevent方法有一個(gè)MyEventArgs類型的參數(shù)。這個(gè)方法用來生成事件。在c#中直接調(diào)用事件名字來生成事件。生成事件需要傳遞兩個(gè)參數(shù):事件發(fā)生者和傳遞給方法的參數(shù)MyEventArgs。

 
 
 
  1. public class MyEventArgs:System.EventArgs 
  2.     …… 
  3. public delegate void MyEventHandler(object sender,MyEventArgs e); 
  4. public class MyControl:UserControl 
  5.     public event MyEventHandler MyEvent; 
  6.     protected virtual void OnMyEvent(MyEventArgs e) 
  7.     { 
  8.         MyEvent(this,e); 
  9.     } 
  10.     …… 

最后一步就是在自定義控件類中實(shí)際地調(diào)用OnMyEvent。

這樣,c#自定義事件的步驟就完成了。


網(wǎng)站名稱:C#自定義事件步步通
當(dāng)前URL:http://m.5511xx.com/article/coghijh.html