C#事件及響應方法概述
C#語言自C/C++演變而來。它是現代、簡單、完全物件導向和型別安全的。C#語言是微軟公司針對.Net平臺才推出來的一門新語言,作為.Net平臺的第一語言,它幾乎集中了所有關於軟體開發和軟體工程研究的最新成果。物件導向、型別安全、元件技術、自動記憶體管理、跨平臺異常處理、版本控制、程式碼安全管理…… <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在.NET應用程式開發中,不管是WEB Forms(ASP.NET)還是Windows Forms,都涉及到大量物件的事件響應及處理,比如客戶線上提交一份訂單、或是在Windows視窗上移動滑鼠等都將有事件發生。那麼在C#中,是怎樣宣告事件併為事件新增響應方法的呢?下面的文章對此為大家作了詳細的講述。
原理簡介
在C#中,一個類可以有域(Fields)、屬性(Properties)、方法(Methods)、索引(Indexs)、事件(Events)等成員,其中事件(Events)成員就是用來宣告一個類事件的。在類中宣告一個事件成員一般採用如下的語法形式:
public event 代表名 事件名。
如在Control類中宣告瞭一個Click事件成員,其語法如下:
public event EventHandler Click;
在C#中,增加了一個新的資料型別delegate(代表)來解決事件處理問題。代表資料型別非常類似於C語言中的指標,其與指標不同的是,其是程式碼是安全的,可管理的。由於C#本身的簡易性,對於沒有使用過C及指標的程式來說,理解delegate也是非常容易的。
在C#中,通過使用delegate,你可以通過“+=”(加等於)操作符非常容易地為.Net物件中的一個事件新增一個甚至多個響應方法;還可以通過非常簡單的“-=”(減等於)操作符取消這些響應方法。如下面為temp按鈕新增Click事件的語句:
temp.Click+=new System.EventHandler(this.Test);//為test新增事件處理方法
在上面宣告事件的語句中,Eventhandler是一個delegate(代表)型別,其在.Net類庫中如下宣告的:
public delegate void EventHandler(object sender,EventArgs e);
這樣,所有形如:void 函婁名(object 引數名,EventArgs 引數名);的函式都可以作為Control類的Click事件響應方法了。如下面所定義的一個事件響應方法:
private void button1_Click(object sender, System.EventArgs e)
由於是通過delegate(代表型別)來處理事件,因此,可能通過累加使一個事件具有多個響應方法;與此同時,還可以使一個方法作為多個事件的響應方法。(注意:在C#語言類中的event成員後面只能出現“+=”與“-=”兩個表示新增與取消事件響應函式的操作符。)
不管是ASP.Net還是一般的Windows Forms 程式設計,在C#中,基本上我們遇到的事件響應方法都是說明成如下的形式:
private void button1_Click(object sender, System.EventArgs e)
那麼,一個事件響應方法的存取許可權、返回值型別、引數及型別甚至方法名稱等是否都必須固定不變呢?答案是:不是!
一般情況下,事件的響應方法中都有兩個引數,其中一個代表引發事件的物件即sender,由於引發事件的物件不可預知的,因此我們把其宣告成為object型別,所有的物件都適用。第二個引數代表引發事件的具體資訊,各種型別的事件中可能不同,這要根據類中事件成員的說明決定。
我們知道,事件是通過delegate(代表) 來處理的。假設將要表示事件的代表說明成如下形式:
delegate int MyEventHandler(object sender, ToolBarButtonClickEventArgs e);
則當涉及上面的事件響應函式宣告時,就須要宣告成如下的形式:
private int MyTest(object sender,ToolBarButtonClickEventArgs e)
{
}
在給物件新增事件響應方法時就可以用如下的程式碼實現:
Control.Event+=new MyEventHandler(MyTest);
示例程式
下面,我們用Visual Studio .Net開發工具設計了一個簡單Windows Forms的程式,向大家展示了C#中具體是怎樣實現事件響應處理的。
*主要類
System.Windows.Forms.Application類:應用程式類。
System.Windows.Forms.Form類:窗體類。
System.Windows.Forms.Label類:文字標籤類,主要用於在視窗上新增標籤資訊。
System.Windows.Forms.Button類:按鈕類,生成一個命令按。
System.EventHandler Delegate(代表):其是.Net類庫中的一個公用代表型別,主要用於說明並初始化一個事件方法,該代表具有兩個引數object sender表示引發事件的物件,System.EventArgs e 代表事件的相應資訊,如滑鼠的x,y值等。
* 設計簡介
在Visual Studio .Net選擇新建Windows 應用程式,選擇程式地址並輸入程式名後,將生成一個非常簡單的初始化窗體Form1類;在初始窗體中新增一個標籤(Label)及一個按鈕(Button)並設定相應的位置大小及屬性值等。雙擊按鈕進入程式碼編輯區,此時系統自動生了一個用於處理按鈕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(),如下:
private void Test(object sender,System.EventArgs e)
{
MessageBox.Show("這是我自定義的事件響應函式!","提示資訊");
}
完成程式碼後儲存,編譯執行即可以看程式中各控制元件的事件響應情況.
* 執行效果
程式執行開始時有一個標籤及一個按鈕,此時點選標籤沒有任何響應資訊,然後點選“為控制元件新增事件”按鈕,將在窗體中增加一個顯示為“新增加的按鈕”的按鈕,此時再點選標籤將會看到有響應資訊,即彈出一個對話方塊說明事作已經得到處理。點選一下“新增加的按鈕”也將看到有事件響應資訊。
再點選“為事件新增按鈕”此時添體介面看到不變,其實已經有兩個顯示為“新增加的按鈕”的按鈕在窗體上,只是因為重複顯示在同一位置看不到而已。非常有趣的是,再點選標籤試一下,我們會發現事件響應方法被執行了兩次。
* 關鍵程式碼及註釋
下面我們列出了本程式中比較核心的程式碼,並作了詳細的註釋,請大家仔細體會。
private void InitializeComponent()//窗體建構函式呼叫的窗體初始化函式,主要由Visual Studio .Net自動生成。
{
this.button1.Click += new System.EventHandler(this.button1_Click); //為button1物件的Click事件新增響應方法button1_Click() 。
}
private void button1_Click(object sender, System.EventArgs e)//系統生成的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.Controls.Add(temp); //把Button物件temp新增到當前窗體中
label1.Click+=new EventHandler(this.Test);//把Test()也新增為標籤(label1)Click事件的響應方法。注意C#中事件響應可以有多個方法或者是一個方法的重複。
}
private void Test(object sender,System.EventArgs e)//自定義事件處理函式,注意函式的引數型別。
{
MessageBox.Show("這是我自定義的事件響應函式!","提示資訊");//彈出一個對話方塊,顯示提示資訊。
}
相關文章
- cc.Node事件響應事件
- 網路安全事件應急響應事件
- 理解響應者和響應鏈如何處理事件事件
- Flutter:如何響應觸控事件Flutter事件
- Flutter:如何響應互動事件?Flutter事件
- UIDatePicker事件不響應問題UI事件
- Java進階09 事件響應Java事件
- 事件傳遞和響應鏈事件
- Flutter事件響應原始碼分析Flutter事件原始碼
- 10046事件概述事件
- c# 獲取當前方法事件對應的控制元件C#事件控制元件
- HDFS應用場景、原理、基本架構及使用方法概述架構
- 記一次安全應急響應事件事件
- HTTP請求方法及響應狀態碼詳解HTTP
- iOS GestureRecognizer與UIResponder touch事件響應iOSUI事件
- B樹概述與簡單應用示例(C#)C#
- 記錄下:iOS事件的事件的傳遞和響應iOS事件
- UIResponder事件響應鏈學習筆記UI事件筆記
- 事件傳遞和響應者鏈條事件
- Java進階學習之事件響應Java事件
- 記一次挖礦病毒應急響應事件事件
- java Servlet結構概述3之請求響應1JavaServlet
- 由自定義事件到vue資料響應事件Vue
- Element 輸入框input響應回車事件事件
- 【Android Developers Training】 67. 響應觸控事件AndroidDeveloperAI事件
- 【IDL】 彈出介面事件響應示例程式事件
- Flutter 使用者互動事件的響應Flutter事件
- c# の 事件C#事件
- 可觀察性在事件響應中的作用事件
- 安全響應中心 — 垃圾郵件事件報告(4.18)事件
- JQuery on()方法繫結動態元素的點選事件無響應的解決辦法jQuery事件
- 不常用卻很有妙用的事件及方法事件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- c#中的事件C#事件
- 淺談 iOS 事件的傳遞和響應過程iOS事件
- Cyber Triage 3.12 for Windows - 數字取證和事件響應Windows事件
- 把握安全事件響應的黃金一小時事件
- 響應式佈局方法總結