首先在VS2010裡建立一個windows程式,只帶有一個button1。點擊button1,出現一個messagebox展示Hello, world!程式。我相信這個程式大家都會的。
下面是原始碼
Form1.Designer.cs
namespace EventStudy{ partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(90, 159); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(100, 39); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button button1; }}
For1.cs
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace EventStudy{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello, world!"); } }}
主要關注這幾行代碼
this.button1.Click += new System.EventHandler(this.button1_Click);
private void button1_Click(object sender, EventArgs e){ MessageBox.Show("Hello, world!");}
上面的第一行代碼是給button1.click事件訂閱一個button1_click方法。
這裡的this.button1.Click
private System.Windows.Forms.Button button1;
button1是一個windows.Form.Button類的一個執行個體
Click是button1類裡面的一個事件,可以想象成是這樣的:
public class Button{ .... public event EventHandler Click; ...}
因為你從上面的code可以看出Click是EventHanlder委託的一個變數。(雖然Button類裡面對於click不見得就是這樣定義的,但是你可以暫且當成這樣定義)
EventHandler這個自然就是一個定義在系統層的委託:
public delegate void EventHandler(object sender, EventArgs e);
這個委託有2個參數,從參數的名字你也可以看出來參數的意思,第一個參數是事件的寄件者,第二個參數是事件參數。
第一個參數好理解了,事件的寄件者。如果你點擊button1, 那這裡的object sender就是button1了。
第二個參數看似不好理解,我們來看下定義:
public class EventArgs { // Summary: // Represents an event with no event data. public static readonly EventArgs Empty; // Summary: // Initializes a new instance of the System.EventArgs class. public EventArgs(); }
它其實就是個空參數,沒什麼意義。
訂閱完後,你只要點擊button1,系統就會調用EventHandler(this.button1_Click)裡面的button1_Click方法。
在這裡就是運行
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello, world!"); }
當我們運行程式進行Debug的時候,可以對於這段代碼有更好的認識
+ this {EventStudy.Form1, Text: Form1} EventStudy.Form1+ sender {Text = "button1"} object {System.Windows.Forms.Button}+ e {X = 69 Y = 28 Button = Left} System.EventArgs {System.Windows.Forms.MouseEventArgs}
當點擊button1的時候,你可以看到
sender = button1
e = {X= 69 Y = 28 Button = Left}
這就是說傳遞給button1_Click的2個參數就是
sender = button1
e = {X= 69 Y = 28 Button = Left}
其實這個不難理解。因為這個方法如果沒有這2個參數,它怎麼能work?
- 如果沒有sender 它怎麼知道這是哪個button1 哪個object發送的方法。比如你有2個button, button1, button2。點擊的時候是不同的事件,如果沒有這個參數其不是button1的事件會調到button2的,button2的會調用到button1的。
- 第二個參數應該是在點擊的時候進行執行個體化的。告訴你點擊的位置和方式。座標不用說了,左鍵的方法更是個重要參數,不然使用者郵件點擊是不是也會觸發這個事件呢?
到這裡對裡有了一定的瞭解了,原來click事件是這樣的:
訂閱這個事件: this.button1.Click += new EventHandler(this.button1_Click);
事件代表的方法:
private void button1_Click(object sender, EventArgs e)
{
// DO SOMETHING;
}
有同學就會問了,我點擊這個button1,系統是怎麼知道調用這個click事件的?這個就是系統的事情了,不用我們操這份心。以後有機會再做深入的研究