关于事件
事件是一種使對象或類能夠提供通知的成員。客戶端可以通過提供事件處理程序為相應的事件添加可執行代碼。
下面這個代碼顯示如何將事件處理程序添加到 Button 類的實例:
?1//?@馬志遠??Copyright
?2
?3public?delegate?void?EventHandler(object?sender,?EventArgs?e);????//?使用事件,首先聲明事件對應的?委托.
?4public?class?Button?:?Control????????????????????????????????????//?繼續一個Button控件
?5{
?6????public?event?EventHandler?Click;????????//?聲明事件,?格式:修飾符+event+該事件的委托+事件命名,event的位置不可調換
?7}
?8public?class?LoginDialog?:?Form????????????????//?窗體
?9{
10????Button?OkButton;????????????????????????//?聲明一個按鈕的實例:OkButton
11????Button?CancelButton;????????????????????//?聲明另一個按鈕實例:CancelButton
12
13????public?LoginDialog()????????????????????//?一個Constructor
14????{
15????????OkButton????????????=?new?Button();
16????????OkButton.Click????????+=new?EventHandler(OkButton_Click);????//?加入事件?Click
17
18????????CancelButton????????=?new?Button();
19????????CancelButton.Click????+=new?EventHandler(CancelButton_Click);
20????}
21
22????void?OkButton_Click(object?sender,?EventArgs?e)????????????????//?委托所對應的事件處理程序?OkButton_Click
23????{
24????????//?寫上OKButton.Click的事件程序
25????}
26
27????void?CancelButton_Click(object?sender,?EventArgs?e)????????????//?委托所對應的事件處理程序?CancelButton_Click
28????{
29????????//?寫上CancelButton_Click的事件處理程序.
30????}
31}創建或標識一個委托。如果正在定義自己的事件,還必須確保有與事件關鍵字一起使用的委托。如果已經預定義了事件(例如在 .NET Framework 中),則事件的使用者只需要知道委托的名稱。 創建一個類,包含: 從委托創建的事件。 (可選)驗證用 event 關鍵字聲明的委托實例是否存在的方法。否則,該邏輯必須放置在引發此事件的代碼中。 調用此事件的方法。這些方法可以重寫一些基類功能。 定義一個或多個將方法連接到事件的類。所有這些類都包括: 使用此事件:
??1//版權所有?(C)?2000?Microsoft?Corporation。保留所有權利。
??2
??3//?events1.cs
??4using?System;
??5namespace?MyCollections?
??6{
??7???using?System.Collections;
??8
??9???//?用于與更改通知掛鉤的委托類型。
?10???public?delegate?void?ChangedEventHandler(object?sender,?EventArgs?e);
?11
?12???//?一個類,該類與?ArrayList?類似,但每當列表更改時將發送
?13???//?事件通知。
?14???public?class?ListWithChangedEvent:?ArrayList?
?15???{
?16??????//?一個事件,每當列表元素更改時,客戶端可以使用該事件
?17??????//?來獲得通知。
?18??????public?event?ChangedEventHandler?Changed;
?19
?20??????//?調用?Changed?事件;每當列表更改時調用
?21??????protected?virtual?void?OnChanged(EventArgs?e)?
?22??????{
?23?????????if?(Changed?!=?null)
?24????????????Changed(this,?e);
?25??????}
?26
?27??????//?重寫可更改列表的某些方法;
?28??????//?在重寫每個方法后調用事件
?29??????public?override?int?Add(object?value)?
?30??????{
?31?????????int?i?=?base.Add(value);
?32?????????OnChanged(EventArgs.Empty);
?33?????????return?i;
?34??????}
?35
?36??????public?override?void?Clear()?
?37??????{
?38?????????base.Clear();
?39?????????OnChanged(EventArgs.Empty);
?40??????}
?41
?42??????public?override?object?this[int?index]?
?43??????{
?44?????????set?
?45?????????{
?46????????????base[index]?=?value;
?47????????????OnChanged(EventArgs.Empty);
?48?????????}
?49??????}
?50???}
?51}
?52
?53namespace?TestEvents?
?54{
?55???using?MyCollections;
?56
?57???class?EventListener?
?58???{
?59??????private?ListWithChangedEvent?List;
?60
?61??????public?EventListener(ListWithChangedEvent?list)?
?62??????{
?63?????????List?=?list;
?64?????????//?將“ListChanged”添加到“List”中的?Changed?事件。
?65?????????List.Changed?+=?new?ChangedEventHandler(ListChanged);
?66??????}
?67
?68??????//?這將在列表發生更改時調用。
?69??????private?void?ListChanged(object?sender,?EventArgs?e)?
?70??????{
?71?????????Console.WriteLine("This?is?called?when?the?event?fires.");
?72??????}
?73
?74??????public?void?Detach()?
?75??????{
?76?????????//?分離事件并刪除列表
?77?????????List.Changed?-=?new?ChangedEventHandler(ListChanged);
?78?????????List?=?null;
?79??????}
?80???}
?81
?82???class?Test?
?83???{
?84??????//?測試?ListWithChangedEvent?類。
?85??????public?static?void?Main()?
?86??????{
?87??????//?創建新的列表。
?88??????ListWithChangedEvent?list?=?new?ListWithChangedEvent();
?89
?90??????//?創建偵聽列表的更改事件的類。
?91??????EventListener?listener?=?new?EventListener(list);
?92
?93??????//?在列表中添加和移除項。
?94??????list.Add("item?1");
?95??????list.Clear();
?96??????listener.Detach();
?97??????}
?98???}
?99}
100
輸出
This is called when the event fires.
This is called when the event fires.
代碼討論
聲明事件?? 若要在類內聲明事件,首先必須聲明該事件的委托類型(如果尚未聲明的話)。
public delegate void ChangedEventHandler(object sender, EventArgs e);
委托類型定義傳遞給處理該事件的方法的一組參數。多個事件可共享相同的委托類型,因此僅當尚未聲明任何合適的委托類型時才需要執行該步驟。
接下來,聲明事件本身。
public event ChangedEventHandler Changed;
聲明事件的方法與聲明委托類型的字段類似,只是關鍵字 event 在事件聲明前面,在修飾符后面。事件通常被聲明為公共事件,但允許任意可訪問修飾符。
調用事件?? 類聲明了事件以后,可以就像處理所指示的委托類型的字段那樣處理該事件。如果沒有任何客戶將委托與該事件掛鉤,該字段將為空;否則該字段引用應在調用該事件時調用的委托。因此,調用事件時通常先檢查是否為空,然后再調用事件。
if (Changed != null)
Changed(this, e);
調用事件只能從聲明該事件的類內進行。
與事件掛鉤?? 從聲明事件的類外看,事件像個字段,但對該字段的訪問是非常受限制的。只可進行如下操作:
在該字段上撰寫新的委托。
從字段(可能是復合字段)移除委托。
使用 += 和 -= 運算符完成此操作。為開始接收事件調用,客戶代碼先創建事件類型的委托,該委托引用應從事件調用的方法。然后它使用 += 將該委托寫到事件可能連接到的其他任何委托上。
// Add "ListChanged" to the Changed event on "List":
List.Changed += new ChangedEventHandler(ListChanged);
當客戶代碼完成接收事件調用后,它將使用運算符 -= 從事件移除其委托。
// Detach the event and delete the list:
List.Changed -= new ChangedEventHandler(ListChanged);
下面這個代碼顯示如何將事件處理程序添加到 Button 類的實例:
?1//?@馬志遠??Copyright
?2
?3public?delegate?void?EventHandler(object?sender,?EventArgs?e);????//?使用事件,首先聲明事件對應的?委托.
?4public?class?Button?:?Control????????????????????????????????????//?繼續一個Button控件
?5{
?6????public?event?EventHandler?Click;????????//?聲明事件,?格式:修飾符+event+該事件的委托+事件命名,event的位置不可調換
?7}
?8public?class?LoginDialog?:?Form????????????????//?窗體
?9{
10????Button?OkButton;????????????????????????//?聲明一個按鈕的實例:OkButton
11????Button?CancelButton;????????????????????//?聲明另一個按鈕實例:CancelButton
12
13????public?LoginDialog()????????????????????//?一個Constructor
14????{
15????????OkButton????????????=?new?Button();
16????????OkButton.Click????????+=new?EventHandler(OkButton_Click);????//?加入事件?Click
17
18????????CancelButton????????=?new?Button();
19????????CancelButton.Click????+=new?EventHandler(CancelButton_Click);
20????}
21
22????void?OkButton_Click(object?sender,?EventArgs?e)????????????????//?委托所對應的事件處理程序?OkButton_Click
23????{
24????????//?寫上OKButton.Click的事件程序
25????}
26
27????void?CancelButton_Click(object?sender,?EventArgs?e)????????????//?委托所對應的事件處理程序?CancelButton_Click
28????{
29????????//?寫上CancelButton_Click的事件處理程序.
30????}
31}
為了創建并使用 C# 事件,必須采取以下步驟:
此類定義事件。
- 使用 += 運算符和 -= 運算符將一個或多個方法與基類中的事件關聯。
- 將與事件關聯的方法的定義。
- 創建包含事件聲明的類對象。
- 使用定義的構造函數,創建包含事件定義的類對象。
C# 中的“事件”是當對象發生某些有趣的事情時,類向該類的客戶提供通知的一種方法。事件最常見的用途是用于圖形用戶界面;通常,表示界面中的控件的類具有一些事件,當用戶對控件進行某些操作(如單擊某個按鈕)時,將通知這些事件。
但是事件未必只用于圖形界面。事件為對象提供一種通常很有用的方法來發出信號表示狀態更改,這些狀態更改可能對該對象的客戶很有用。事件是創建類的重要構造塊,這些類可在大量的不同程序中重復使用。
使用委托來聲明事件。事件是類允許客戶為其提供方法(事件發生時應調用這些方法)的委托的一種方法。事件發生時,將調用其客戶提供給它的委托。
生活中的使用事件:例如,某字處理器可能包含打開的文檔的列表。每當該列表更改時,可能需要通知字處理器中的許多不同對象,以便能夠更新用戶界面。使用事件,維護文檔列表的代碼不需要知道需要通知誰,一旦文檔列表發生了更改,將自動調用該事件,正確通知每個需要通知的對象。使用事件提高了程序的模塊化程度。
??1//版權所有?(C)?2000?Microsoft?Corporation。保留所有權利。
??2
??3//?events1.cs
??4using?System;
??5namespace?MyCollections?
??6{
??7???using?System.Collections;
??8
??9???//?用于與更改通知掛鉤的委托類型。
?10???public?delegate?void?ChangedEventHandler(object?sender,?EventArgs?e);
?11
?12???//?一個類,該類與?ArrayList?類似,但每當列表更改時將發送
?13???//?事件通知。
?14???public?class?ListWithChangedEvent:?ArrayList?
?15???{
?16??????//?一個事件,每當列表元素更改時,客戶端可以使用該事件
?17??????//?來獲得通知。
?18??????public?event?ChangedEventHandler?Changed;
?19
?20??????//?調用?Changed?事件;每當列表更改時調用
?21??????protected?virtual?void?OnChanged(EventArgs?e)?
?22??????{
?23?????????if?(Changed?!=?null)
?24????????????Changed(this,?e);
?25??????}
?26
?27??????//?重寫可更改列表的某些方法;
?28??????//?在重寫每個方法后調用事件
?29??????public?override?int?Add(object?value)?
?30??????{
?31?????????int?i?=?base.Add(value);
?32?????????OnChanged(EventArgs.Empty);
?33?????????return?i;
?34??????}
?35
?36??????public?override?void?Clear()?
?37??????{
?38?????????base.Clear();
?39?????????OnChanged(EventArgs.Empty);
?40??????}
?41
?42??????public?override?object?this[int?index]?
?43??????{
?44?????????set?
?45?????????{
?46????????????base[index]?=?value;
?47????????????OnChanged(EventArgs.Empty);
?48?????????}
?49??????}
?50???}
?51}
?52
?53namespace?TestEvents?
?54{
?55???using?MyCollections;
?56
?57???class?EventListener?
?58???{
?59??????private?ListWithChangedEvent?List;
?60
?61??????public?EventListener(ListWithChangedEvent?list)?
?62??????{
?63?????????List?=?list;
?64?????????//?將“ListChanged”添加到“List”中的?Changed?事件。
?65?????????List.Changed?+=?new?ChangedEventHandler(ListChanged);
?66??????}
?67
?68??????//?這將在列表發生更改時調用。
?69??????private?void?ListChanged(object?sender,?EventArgs?e)?
?70??????{
?71?????????Console.WriteLine("This?is?called?when?the?event?fires.");
?72??????}
?73
?74??????public?void?Detach()?
?75??????{
?76?????????//?分離事件并刪除列表
?77?????????List.Changed?-=?new?ChangedEventHandler(ListChanged);
?78?????????List?=?null;
?79??????}
?80???}
?81
?82???class?Test?
?83???{
?84??????//?測試?ListWithChangedEvent?類。
?85??????public?static?void?Main()?
?86??????{
?87??????//?創建新的列表。
?88??????ListWithChangedEvent?list?=?new?ListWithChangedEvent();
?89
?90??????//?創建偵聽列表的更改事件的類。
?91??????EventListener?listener?=?new?EventListener(list);
?92
?93??????//?在列表中添加和移除項。
?94??????list.Add("item?1");
?95??????list.Clear();
?96??????listener.Detach();
?97??????}
?98???}
?99}
100
輸出
This is called when the event fires.
This is called when the event fires.
代碼討論
聲明事件?? 若要在類內聲明事件,首先必須聲明該事件的委托類型(如果尚未聲明的話)。
public delegate void ChangedEventHandler(object sender, EventArgs e);
委托類型定義傳遞給處理該事件的方法的一組參數。多個事件可共享相同的委托類型,因此僅當尚未聲明任何合適的委托類型時才需要執行該步驟。
接下來,聲明事件本身。
public event ChangedEventHandler Changed;
聲明事件的方法與聲明委托類型的字段類似,只是關鍵字 event 在事件聲明前面,在修飾符后面。事件通常被聲明為公共事件,但允許任意可訪問修飾符。
調用事件?? 類聲明了事件以后,可以就像處理所指示的委托類型的字段那樣處理該事件。如果沒有任何客戶將委托與該事件掛鉤,該字段將為空;否則該字段引用應在調用該事件時調用的委托。因此,調用事件時通常先檢查是否為空,然后再調用事件。
if (Changed != null)
Changed(this, e);
調用事件只能從聲明該事件的類內進行。
與事件掛鉤?? 從聲明事件的類外看,事件像個字段,但對該字段的訪問是非常受限制的。只可進行如下操作:
在該字段上撰寫新的委托。
從字段(可能是復合字段)移除委托。
使用 += 和 -= 運算符完成此操作。為開始接收事件調用,客戶代碼先創建事件類型的委托,該委托引用應從事件調用的方法。然后它使用 += 將該委托寫到事件可能連接到的其他任何委托上。
// Add "ListChanged" to the Changed event on "List":
List.Changed += new ChangedEventHandler(ListChanged);
當客戶代碼完成接收事件調用后,它將使用運算符 -= 從事件移除其委托。
// Detach the event and delete the list:
List.Changed -= new ChangedEventHandler(ListChanged);
轉載于:https://www.cnblogs.com/mazhiyuan/articles/286939.html
總結
- 上一篇: 杂论架构—架构是一种设计 转。。。
- 下一篇: When we use PdfStamp