C# 事件及回應程式法

來源:互聯網
上載者:User
響應

  C#語言自C/C++演變而來。它是現代、簡單、完全物件導向和型別安全的。C#語言是微軟公司針對.Net平台才推出來的一門新語言,作為.Net平台的第一語言,它幾乎集中了所有關於軟體開發和軟體工程研究的最新成果。物件導向、型別安全、組件技術、自動記憶體管理、跨平台異常處理、版本控制、代碼安全管理……
  在.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("這是我自訂的事件響應函數!","提示資訊");//彈出一個對話方塊,顯示提示資訊。
  }

 



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。