關於C# Windows 程式設計裡的button click事件的分析

來源:互聯網
上載者:User

首先在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?

  1. 如果沒有sender 它怎麼知道這是哪個button1 哪個object發送的方法。比如你有2個button, button1, button2。點擊的時候是不同的事件,如果沒有這個參數其不是button1的事件會調到button2的,button2的會調用到button1的。
  2. 第二個參數應該是在點擊的時候進行執行個體化的。告訴你點擊的位置和方式。座標不用說了,左鍵的方法更是個重要參數,不然使用者郵件點擊是不是也會觸發這個事件呢?

 

到這裡對裡有了一定的瞭解了,原來click事件是這樣的:

訂閱這個事件: this.button1.Click += new EventHandler(this.button1_Click);

事件代表的方法:

private void button1_Click(object sender, EventArgs e)

{

    // DO SOMETHING;

}

 

有同學就會問了,我點擊這個button1,系統是怎麼知道調用這個click事件的?這個就是系統的事情了,不用我們操這份心。以後有機會再做深入的研究

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.