




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C# 事件及響應方法讓你明白 private void button1_Click(objectsender, System.EventArgs e)C#語言自C/C+演變而來。它是現(xiàn)代、簡單、完全面向?qū)ο蠛皖愋桶踩?。C#語言是微軟公司針對.Net平臺才推出來的一門新語言,作為 .Net平臺的第一語言,它幾乎集中 了所有關于軟件開發(fā)和軟件工程研究的最新成果。面向?qū)ο?、類型安全、組件技術、自動內(nèi)存管理、跨平臺異常處理、版本控制、代碼安全管理 在.NET應用程序開發(fā)中, 不管是 WEB Forms (ASP.NET )還是 Windows Forms , 都涉及到大量對象的事件響應及處理,比如客
2、戶在線提交一份訂單、或是在 Windows窗口上移動鼠標等都將有事件發(fā)生。那么在C#中,是怎樣聲明事件并為事件添加響應方法的呢?下面的文章對此為大家作了詳細的講述。原理簡介在C#中,一個類可以有域 (Fields)、屬性(Properties)、方法(Methods)、索引(Ind exs)、事件(Events)等成員,其中事件(Events)成員就是用來聲明一個類事件的。在類中 聲明一個事件成員一般采用如下的語法形式:public event 代表名事件名。如在Control類中聲明了一個 Click事件成員,其語法如下:public event EventHandlerClick;在C#中
3、,增加了一個新的數(shù)據(jù)類型delegate(代表)來解決事件處理問題。代表數(shù)據(jù)類型非常類似于 C語言中的指針,其與指針不同的是,其是代碼是安全的,可管理的。由于C#本身的簡易性,對于沒有使用過C及指針的程序來說,理解 delegate 也是非常容 易的。在C#中,通過使用delegate ,你可以通過"+=”(加等于)操作符非常容易地為 .Ne t對象中的一個事件添加一個甚至多個響應方法;還可以通過非常簡單的-=”(減等于)操作符取消這些響應方法。如下面為 temp按鈕添加Click事件的語句:temp.Click+=new System.EventHandler(this.Test)
4、;/為 test 添加事件處理方法在上面聲明事件的語句中,Eventhandler 是一個delegate(代表)類型,其在.Net類庫中如下聲明的:public delegate void EventHandler(object sender,EventArgs e);這樣,所有形如:void函婁名(object 參數(shù)名,EventArgs 參數(shù)名);的函數(shù)都可以作為Control類的Click事件響應方法了。如下面所定義的一個事件響應方法:private void button1_Click(objectsender, System.EventArgs e)由于是通過delegate (代
5、表類型)來處理事件,因此,可能通過累加使一個事件具有 多個響應方法;與此同時,還可以使一個方法作為多個事件的響應方法。(注意:在C#語言類中的event成員后面只能出現(xiàn)“+=”與-=”兩個表示添加與取消事件響應函數(shù)的操作符。)不管是ASP.Net還是一般的 Windows Forms 編程,在C#中,基本上我們遇到的 事件響應方法都是說明成如下的形式:private void button1_Click(object sender, System.EventArgs e)那么,一個事件響應方法的存取權限、返回值類型、參數(shù)及類型甚至方法名稱等是否都必須固定不變呢?答案是:不是!一般情況下,事件的
6、響應方法中都有兩個參數(shù),其中一個代表引發(fā)事件的對象即sender,由于引發(fā)事件的對象不可預知的,因此我們把其聲明成為object類型,所有的對象都適用。第二個參數(shù)代表引發(fā)事件的具體信息,各種類型的事件中可能不同,這要根據(jù)類中事件成員的說明決定。我們知道,事件是通過delegate(代表)來處理的。假設將要表示事件的代表說明成如 下形式:delegate intMyEventHandler(object sender, ToolBarButtonClickEventArgs e);則當涉及上面的事件響應函數(shù)聲明時,就須要聲明成如下的形式:private intMyTest(object send
7、er,ToolBarButtonClickEventArgse) 在給對象添加事件響應方法時就可以用如下的代碼實現(xiàn):Control.Event+=new MyEventHandler(MyTest);示例程序下面,我們用 Visual Studio .Net開發(fā)工具設計了一個簡單Windows Forms的程序,向大家展示了 C#中具體是怎樣實現(xiàn)事件響應處理的。*豐要舉System.Windows.Forms.ApplicationSystem.Windows.Forms.FormSystem.Windows.Forms.Label類:應用程序類。類:窗體類。類:文字標簽類,主要用于在窗口上添
8、加標簽信息。System.Windows.Forms.Button 類:按鈕類,生成一個命令按。System.EventHandler Delegate( 代表):其是.Net類庫中的一個公用代表類型, 主要用于說明并初始化一個事件方法,該代表具有兩個參數(shù)object sender表示引發(fā)事件的對象,System.EventArgs e代表事件的相應信息,如鼠標的 x,y值等。*設計簡介在Visual Studio.Net選擇新建 Windows 應用程序,選擇程序地址并輸入程序名后,將生成一個非常簡單的初始化窗體Form1類;在初始窗體中添加一個標簽(Label)及一個按鈕(Button)并
9、設置相應的位置大小及屬性值等。雙擊按鈕進入代碼編輯區(qū),此時系統(tǒng)自動生了一個用于處理按鈕Click事件的方法,即button1_Click() 。在方法中添如下的代碼:Button temp=new Button();temp.Text="新增加的按鈕”;temp.Location=new Point(30,80);temp.Click+=new EventHandler(this.Test);this.Controls.Add(temp);label1.Click+=new EventHandler(this.Test);完成后,為窗體Form1類添加一個響應事件的方法Test(),
10、如下:private void Test(object sender,System.EventArgs e)MessageBox.Show("這是我自定義的事件響應函數(shù)!”,”提示信息,完成代碼后保存,編譯運行即可以看程序中各控件的事件響應情況*運行效果程序運行開始時有一個標簽及一個按鈕,此時點擊標簽沒有任何響應信息,然后點擊為控件添加事件”按鈕,將在窗體中增加一個顯示為新增加的按鈕”的按鈕,此時再點擊標簽將會看到有響應信息,即彈出一個對話框說明事作已經(jīng)得到處理。點擊一下新增加的按鈕”也將看到有事件響應信息。再點擊為事件添加按鈕”此時添體界面看到不變,其實已經(jīng)有兩個顯示為新增加的按鈕
11、”的按鈕在窗體上,只是因為重復顯示在同一位置看不到而已。非常有趣的是,再點擊標 簽試一下,我們會發(fā)現(xiàn)事件響應方法被執(zhí)行了兩次。關鍵代碼及注釋卜面我們列出了本程序中比較核心的代碼,并作了詳細的注釋,請大家仔細體會。private void InitializeComponent()/窗體構造函數(shù)調(diào)用的窗體初始化函數(shù),主要由Visual Studio .Net自動生成。(this .button1.Click +=new System.EventHandler( this .button1_Click);/為button1 對象的 Click事件添加響應方法button1_Click()。priv
12、ate void button1_Click( object sender, System.EventArgs e)/ 系統(tǒng)生成的button1 按鈕的Click事件響應方法。(Button temp= new Button(); / 生成一個 Button 對象temp.Text= "新增加的按鈕";/設置Button對象的外觀屬性temp.Location= new Point( 30 , 80 );temp.Click+= new EventHandler( this .Test); / 把 Test()添加新增按鈕 Click 事件的響應方法。this .Contr
13、ols.Add(temp);/ 把 Button 對象 temp 添加到當前窗體中l(wèi)abel1.Click+= new EventHandler( this .Test); / 把 Test()也添加為標簽(label1)Click 事件的響應方法。注意C#中事件響應可以有多個方法或者是一個方法的重復。private void Test( object sender,System.EventArgs e)/ 自定義事件處理函數(shù),注意函數(shù)的參數(shù)類型。(MessageBox.Show( "這是我自定義的事件響應函數(shù)!",”提示信息”);/彈出一個對話框,顯示提示信息。比如,在寫
14、這個類的時候,根本就不能確定要調(diào)用哪個對象的方法:例如,你把自己的一個對象上的方法掛在微軟的 button的一個事件上。微軟在寫button時 根本就不可能知道這個事件發(fā)生時,需要調(diào)用哪個對象的哪個方法,只有你自己去指定說需要調(diào)什么方法,并且以委托的方式掛在相應的事件上。微軟在寫 button的事件時,唯一能確定的是這個事件的格式,或者說這個事件需要調(diào)用的 方法的格式,類似丁 button1_click(object sender, EnentArgs e)等等。只要是按照這個類型寫的方法,都能&在這個事件上,并且在事件發(fā)生時,方法會被調(diào)用。而規(guī)定 了事件方法格式,就確保了事件發(fā)生時被
15、調(diào)用的方法都是合法的,不會出現(xiàn)方法類型不匹配等等。這就是所謂的委托是類型安全的。通俗的說就是你在寫一個類的時候,這個類要完成一件事情,但是你有不知道這 件事情該怎么完成,你只知道要完成這件事情,只有這個類在運行的時候調(diào)用者 方知道怎么完成這件事情,這時候你用一個委托來告訴調(diào)用者,這時候要完成一 件事情,至丁事情怎么完成則有調(diào)用方通過委托來完成delegate ),岡Q開始學的時候覺得很難理解。我的理解是這樣的 :首先它是一個類,定義了方法的類型,使得可以將方法當作另一個方法的參數(shù)來進行傳遞, 這種將方法動態(tài)地賦給參數(shù)的做法,同時使得程序具有更好的可擴展性。今天看到一個朋友的解釋,我感到很奇妙。
16、所以摘錄下來了:比如說你去看電影,電影院賣給你兩張票,不過在賣的時候他肯定不知道這個位置是你座還是你 朋友座,是男的座還是女的座.只有等電影開場了 ,大家都做上去了一切就清楚.你可以將委托理解為一個占位符,就是先站一個位置.具體是什么東西等用的時候在指定.其實這只是從一個側(cè)面去解釋了dlegate ,不過很生動形象。那既然是從一個側(cè)面解釋了,那委托還有那些功能呢。為什么要使用委托呢。如很多人所想,有些地方可以直接調(diào)用對象的方法,而不用委托。但有些時候這樣做不合 適。比如,在寫這個類的時候,根本就不能確定要調(diào)用哪個對象的方法:例如,你把自己的 一個對象上的方法掛在微軟的textbox的一個事件上
17、。微軟在寫textbox時根本就不可能知道這個事件發(fā)生時,需要調(diào)用哪個對象的哪個方法,只有你自己去指定說需要調(diào)什么方法, 并且以委托的方式掛在相應的事件上。微軟在寫textbox的事件時,唯一能確定的是這個事件的格式,或者說這個事件需要調(diào)用的方法的格式,類似于button1_click(object sender, EnentArgs e) 等等。 只要是按照這個類型寫的方法,都能被掛在這個事件上,并且在事件發(fā)生時, 方法會被調(diào)用。而規(guī)定了事件方法格式,就確保了事件發(fā)生時被調(diào)用的方法都是合法的,不會出現(xiàn)方法類型不匹配等等。這就是所謂的委托是類型安全的。而C+下面用void*的函數(shù)指針實現(xiàn)事件處
18、理缺少對函數(shù) 格式的檢查。所以 C#發(fā)明了委托這個怪東西,為的就是然被調(diào)用的函數(shù)格式正確。委托的組成部分:嘍托類型的名稱都應該以EventHandler結(jié)束。嘍托的原型定義:有一個void返回值,并接受兩個輸入?yún)?shù):一個 Object類型,一個EventArgs 類型(或繼承自 EventArgs)。胃件的命名為委托去掉 EventHandler之后剩余的部分。*惟承自EventArgs的類型應該以 EventArgs 結(jié)尾。范例:(note :假設我們有個高檔的熱水器,我們給它通上電,當水溫超過 95度的時候:1、揚 聲器會開始發(fā)出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水
19、已經(jīng)快燒開了。我們寫個程序來模擬這個燒水的過程,我們將定義一個類來代表熱水器,我們管它叫:Heater,它有代表水溫的字段,叫做temperature ;當然,還有必不可少的給水加熱方法BoilWater(),一個發(fā)出語音警報的方法MakeAlert(),一個顯示水溫的方法,ShowMsg()。)using System;using System.Collections.Generic;using System.Text;namespace Delegate /熱水器publicclass Heater privateint temperature;publicstring type = &q
20、uot;RealFire 001" ;/ 添加型號作為演示publicstring area = "China Xian" ;/ 添加產(chǎn)地作為演示/應明委托publicdelegatevoid BoiledEventHandler(Object sender, BoiledEventArgs e);publicevent BoiledEventHandler Boiled; /沛明事件/定義BoiledEventArgs 類,傳遞給 Observer所感興趣的信息publicclass BoiledEventArgs : EventArgs publicreado
21、nlyint temperature;public BoiledEventArgs( int temperature) this .temperature = temperature; /可以供繼承自Heater的類重寫,以便繼承類拒絕其他對象對它的監(jiān)視protectedvirtualvoid OnBoiled(BoiledEventArgs e) if (Boiled != null) ( /如果有對象注冊Boiled( this, e); /調(diào)用所有注冊對象的方法/燒水。publicvoid BoilWater() (for (int i = 0; i <= 100; i+) (te
22、mperature = i;if (temperature > 95) (/建立 BoiledEventArgs 對象。BoiledEventArgs e = new BoiledEventArgs(temperature);OnBoiled(e); / 調(diào)用 OnBolied 方法/警報器publicclass Alarm (publicvoid MakeAlert(Object sender, Heater.BoiledEventArgs e) (Heater heater = (Heater)sender;這里是不是很熟悉呢?/訪問sender中的公共字段Console .WriteLine( "Alarm : 0 - 1:" , he
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煉油廠智能化與大數(shù)據(jù)應用考核試卷
- 電氣機械系統(tǒng)的智能化旅游應用考核試卷
- 糖批發(fā)企業(yè)市場競爭力評估與提升考核試卷
- 8-1數(shù)模轉(zhuǎn)換電子課件
- 朋友和我初二語文作文
- 汽車配件售后服務提升考核試卷
- 稀土金屬加工中的設備投資與經(jīng)濟效益分析案例考核試卷
- 疏散通道的安全標識與規(guī)范設置考核試卷
- 碳素材料在化學合成中的催化作用考核試卷
- 手腕康復器材考核試卷
- 大車司機勞務協(xié)議書
- 中醫(yī)把脈入門培訓課件
- 學生軍訓教官合同協(xié)議
- 期刊編輯的學術期刊內(nèi)容審核標準考核試卷
- 知識產(chǎn)權監(jiān)管培訓課件
- 油田節(jié)能降耗技術-全面剖析
- 廣西欽州市欽州港經(jīng)濟技術開發(fā)區(qū)中學2025年初三第二學期第一次區(qū)模擬化學試題含解析
- 技術信息收集與分析方法考核試卷
- 婦科護理標準化管理
- 小學2025年國防教育課程開發(fā)計劃
- 2025屆安徽省示范高中皖北協(xié)作區(qū)高三下學期一模考試英語試題(原卷版+解析版)
評論
0/150
提交評論