程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> VB.NET之旅(十二)—事件驅動

VB.NET之旅(十二)—事件驅動

編輯:VB.NET

“可視繼承原來這麼方便!”我心中默默地感歎一聲。一會兒之後 ,我抬頭掃了一眼屏幕上的代碼後,突然發現了一個新問題,按鈕的單擊事件程 序現在已經變成了:

而原來的VB程序是那麼的簡單。現在的參量Sender和e是干什麼用的?那個 Handles又是什麼東東?還好有老師,我立刻起身,厚著臉把大李請過來,把疑問 一一說給他聽。

大李推了推眼鏡,反問我道:“你應該對Windows編 程中的事件驅動程序設計很熟悉吧?”(注:此處的Windows是指Win9X及其 以上的操作系統)

“是呀!”看來反問是大李授課的開篇詞了,但我也只好先往他的 圈套裡跳,“事件驅動就是說應用程序的執行流程是由外界發生的事件所確 定的。也就是接受到任務才工作的模式。事件就是一個信號,它告知應用程序有 重要情況要發生。實際上的執行情況是,各個應用程序把負責不同工作的對象在 其運行期間送入Windows 操作系統,讓這些對象等待Windows產生的事件,然後加 以處理。”

“VB程序員一般也只需要象你這樣理解就行了。 ”大李的話真讓我觸動,“應該說是Windows先產生消息,應用程序中 的窗口程序window procedure能接收來自windows的消息,並將其轉化為事件,這 個我們以後再說。現在來看看事件驅動程序的組成,主要是有事件、對象和事件 處理程序三個要素。對象就是完成任務的主體,比如你說的Button1;事件麼,就 是對象要執行的任務,比如單擊,就是click事件;那麼事件處理程序就是 Button1_Click這段程序了。”

“這個我知道呀!我只是想問 一下Sender……”我疑惑地回應道。

大李哥搖搖手, 打斷了我的話。“如果你真正清楚事件驅動的話,就明白了。你看一下, Sender是什麼類型的變量?”

“object呀!”我無奈地 問道著,“但是,……”我隱約感覺到了什麼。

大李微笑著說,“sender as object,就一語道破它的來源與用途。object 是支持 .NET 框架類層次結構中的所有類,並為派生類提供低級別服務。這是 .NET 框架中所有類的最終超類;它是類型層次結構的根。一般來說,sender在形 參中表示引發事件的源頭,就是我剛才所說的三要素中的‘對象’。 如果在控件引發的事件中寫代碼的話,一般都不需要再重新指派,因為它已經默 認為是該控件了。當自己寫代碼來調用某事件程序時,就要注明sender是何物了 。”

“也就是說,sender是提供給在事件處理程序代碼內部或 外部進行調用的嗎?”我仍有點不明白。

“可以這樣說,你難 道看不出VB.NET提供給我們的是更全面、更直接的控制嗎?再說e,表示的是事件 數據,就是一個事件激發所需要的狀態信息。在事件引發時不向事件處理程序傳 遞狀態信息的事件會將e設為Eventargs。如果事件處理程序需要狀態信息,則應 用程序必須從此類派生一個類來保存數據。比如 Mousedown事件,系統需要判斷 mouse的位置、判斷是左中右哪個鍵點擊了、判斷點擊了幾下等等,因此該e就必 需是 System.Windows.Forms.MouseEventArgs類的實例。”大李繼續解說著 。

“哦,也就是說e是和事件密切相關的喽?”我開始用實際 操作來證實一下,我在代碼窗口的“類名”下拉列表中選擇了Button1 ,在其右邊的“方法名稱”下拉列表中選擇了MosueDown方法,出現的 就是Button1.MouseDown事件處理程序代碼段:

Private Sub 

Button1_MouseDown(ByVal sender As Object, ByVal e As 

System.Windows.Forms.MouseEventArgs) 
    Handles Button1.MouseDown 
End Sub

果然,看到e的類型變為 System.Windows.Forms.MouseEventArgs。我在代碼段內寫下e,然後在其後打一 個點,出現了一個智能感知菜單(如圖1所示):

與button1.click事件相 比,button1.Mosuedown事件中的e的屬性和方法多出了五個描述事件特征的屬性 ,見表1所述。

表1 多出的e的屬性

“我明白了,那麼Handles關鍵字是不 是就是用於聲明代碼是要處理哪個事件的處理過程呢?”我終於開了點竅。

“是的,可不要小看Handles,好好利用它,你的程序會變得簡潔和 靈活。”大李邊說邊給我寫了一段代碼:

Private Sub 

Button1_Click(ByVal sender As System.Object, ByVal e As 

System.EventArgs) _ 
    Handles Button1.Click, Button2.Click 
    Select Case sender.name 
      Case "Button1" 
        MsgBox("你點擊的是button1") 
      Case "Button2" 
        MsgBox("你點擊的是button2") 
    End Select 
End Sub

“在Handles後面寫了兩個事件的聲明,就可以在同一段 代碼中對兩個對象進行控制。另外,利用Sender和e我們還可以更方便地構建與調 用自己的事件處理程序。“大李邊寫邊說。

“是嗎?怎麼實現 ?”我不由被激發出了濃濃的興趣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved