有的時候,用戶可能覺得Visual Studio的工程是一系列的順序發生的過程,但是在大多數情況下,其實程序是事件驅動的(event driven)---也就是說,程序的運行都是取決於一些諸如點擊鍵盤,點擊鼠標以及一些用戶自定義的事件。不象線性進行的程序那樣,它在有些時候不可能決定是要運行哪一個事件驅動的特定過程。事件對現在的編程而言可以說是一個基本的組成部分,因為這些事件可以讓用戶寫出能對對象之外的世界做出反應的程序,諸如用戶的輸入和其他對象輸入的信息。
1.事件
事件是用來告知應用程序,一些重要的事情的發生。例如,當用戶點擊了窗體中的一個控件時,一個Click事件被觸發了,並且可以調用一個事件處理過程。事件也可以讓一些不相關的過程聯系在一起。例如,有一個過程需要做很多事情,諸如一系列的操作,用戶可以把一系列的事件組成一個獨立的線程。如果用戶決定要取消一個操作,應用程序可以發出一個cancel事件,來阻止這一系列操作的進行。
2.事件發送器
一個可以引發一個事件的對象是一個事件發送器,例如:窗體、控件以及用戶定義的對象。
3.事件的聲明
在類中,事件的聲明是用關鍵字Event來進行的。例如:
Event AnEvent(Byval EventNumber As Integer)
4.事件的引發
事件就象一件非常重要的事情發生了,而宣布這件重要的事情的行為就叫做事件的引發。從實踐的角度來講,一個事件不能象方法那樣被使用,就如同不能用Button1.Click去引發一個button的點擊事件一樣。事件必須使用RaiseEvent關鍵字來引發。下面的例子引發了一個名為AnEvent的事件:
RaiseEvent AnEvent(EventNumber)
5.事件的處理
事件的處理是當一個相關事件發生以後調用的一個過程,如果用戶在編輯環境下雙擊一個窗體上的一個控件,或者從屬性窗口的下拉框中選擇一個事件的話,vb.net將會自動建立一個事件處理過程。Visual Basic使用標准的約定的表述來命名這個過程,這種命名方法就是把事件的發生器(引發事件的對象)和事件的名稱用下劃線連起來。例如,名為button1的點擊事件可以這樣表示:
sub button1_click
用戶可以用這種命名法對自己定義的事件進行命名,但是如果用戶用了Handles關鍵字的話就沒有必要這樣做了。
6.把事件和事件處理聯系起來
在一個事件處理可以使用之前,用戶需要把它和一個事件用WithEvents或者AddHandler聯系起來。
WithEvents的陳述和Handles從句聲明一個事件處理的方法,無論是怎樣的WithEvents變量,分配的對象都能夠激發一個特定的事件的處理。
AddHandler和RemoveHandle陳述能夠允許用戶動態地連接和斷開事件與事件處理的過程。
在有些情況下,例如把一些事件和一些標准的控件聯系,vb.net將會把事件處理和一個事件聯系在一起。例如,在vb.net先前的版本的設計環境中,用戶可以雙擊一個按鈕控件,然後一個空的事件處理過程就產生了,用戶可以在裡面加入代碼,在代碼的背後,Visual Basic通過隱型地產生一個WithEvents變量就可以把事件處理過程和事件聯系起來,這個空的事件處理過程如下:
Private Sub Command1_Click()
End Sub
正如這個過程一樣,vb.net也可以通過在設計環境下雙擊一個按鈕控件來建立一個事件處理過程,下面就是當雙擊一個按鈕控件以後,系統自動生成的代碼:
Private WithEvents Button1 As System.WinForms.Button Proteced Sub Button1_Click(Byval sender As System.Object,_ Byval e As System.EventArgs) End Sub
雖然從代碼本身來看有很多不同,但是事件處理是一樣的。新加的參數對於控件的事件處理而言是必需的,在大多數情況下,用戶並不需要使用它們。
7.給一個類加事件
用戶可以通過使用Events表述來聲明一個類的事件,聲明包含了事件的名稱和參數。
首先,在定義類的類模塊的聲明欄中使用Event陳述聲明一個有參數的事件,例如:
Public Event PercentDone(Byval Percent AS Single,_
ByRefCancel As Boolean)
事件總是被聲明為公有的,而且,事件沒有返回值、可選參數或者數組參數。
給一個類加一個事件說明了只要是這種類的對象就能夠引發這種特定的事件,用戶需要使用RaiseEvent表述來讓一個事件真正運行起來,一旦事件運行起來以後,用戶就可以使用WithEvents或者AddHandler把事件和事件處理過程聯系起來。
8.事件處理過程
用戶可以使用WithEvents和AddHandler關鍵字編寫事件處理過程。
用WithEvents處理事件:
(1)在能夠處理事件的模塊的聲明欄中,用關鍵字WithEvents加入類的變量,這個變量必須是一個模塊級的變量。
(2)在代碼編輯環境的左邊的下攔框中,選擇用WithEvents聲明的變量。
(3)在代碼編輯環境的右邊的下拉框中,選擇希望能處理的事件(如果可能的話,可以對一個對象處理多種事件)。
(4)把代碼加入到事件處理過程中,並使用相關的參數。
使用AddHandler處理事件:
AddHandler和RemoveHandler結合起來使用,可以實現WithEvents表述的功能。但是允許用戶動態地添加、移除以及改變和事件有關的錯誤處理。AddHandler有兩個參數、事件發送器(比如控件)的名稱和一個表達式,這個表達式表明一種委托關系。當用戶使用AddHandler時,沒有必要顯性地聲明委托類,對委托關系的引用,可以通過AddressOf來返回。下面的例子把一件事件處理過程和一個按鈕的點擊事件聯系在一起,委托關系來自於建立一個新的System.EventHandler的實例。
AddHandlerButton1.Click.NewSystem.EventHandler(AddressOf
me.Button1ClickEventHandler
(1)要處理事件的模塊的聲明欄中加入一個類的變量。
(2)用AddHandler表述並且表明事件發送器的名稱,以及含有事件處理過程的AddressOf表述代碼。例如:
Dim h As New HH()
AddHandler h.Oevent,AddressOf Me.handleTheEvent