事件處理的本質

當在點擊一個按鈕執行某個操作時,你有沒有想過,爲什麼點擊了這個按鈕就會執行某個操作,這是爲什麼?那麼接下來就讓我來解開這裏面的祕密。
用微軟中定義的事件函數來說明這個問題是再簡單不過的的事情了。
首先,點擊按鈕是一個事件,也就是說,當你點擊了按鈕就相當於是觸發了一個事件,學過C#窗體編程的同學都知道,事件是其中常用一個屬性,按鈕的觸發就使用了這個屬性。
不閒談了,解決實際的問題。
將按鈕的整個過程分開爲兩個過程,1.按鈕點擊事件發生。2.執行事件函數,完成相應的操作。可以想象一下,這兩個過程在分開時都可以方便地實現,第一條只需要創建一個按鈕點擊區域,來檢測鼠標或觸碰是否在本按鈕區域之內即可,第二條也只需要創建一個事件處理函數即可。關鍵是怎樣在這兩點之間架起一個傳遞信息的橋樑,事件發生時怎樣調用事件處理函數。
接下來是乾貨,話不多說直接上代碼:
這是一個窗體程序,實現的基本工能是,創建一個按鈕Button,創建一個文本輸入框TextBox,創建一個顯示文本條Label。程序中預先設置好一個體重基礎值weight。當在文本中輸入一個數值後,點擊button按鈕,程序內部判斷這個值是大於原先設置的值,還是小於原先設置的值,如果大於原先設置的值就在label中顯示“小明變胖了,現在的體重是”同時再把這個值給這個給weight。如果小於這個值就顯示“小明變瘦了,現在體重是”同時把這個值給weight。借這個程序來說明按鈕的執行本質。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _13._6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void WeightChangedEventHandler(object sender, EventArgs e);
        class Woman
        {
            #region 構造函數
            public Woman(string n,int a,double w)
            {
                _name = n;
                _age = a;
                _weight = w;
            }
            #endregion

            #region 事件
            public event WeightChangedEventHandler GetFatter;
            public event WeightChangedEventHandler GetThinner;
            #endregion
            #region 屬性
            private string _name;           
            public string Name1
            {
                get
                {
                    return _name;
                }
                set
                {
                    _name = value;
                }
            }
            private int _age;
            public int Age
            {
                get
                {
                    return _age;
                }
                set
                {
                    if (value < 15 || value > 60)
                    {
                        throw new ArgumentOutOfRangeException("輸入的年齡不合理");
                    }
                    _age = value;
                }
            }
            private double _weight;
            public double Weight
            {
                get
                {
                    return _weight;
                }
                set
                {
                    if (value < 30 || value > 200)
                    {
                        throw new ArgumentOutOfRangeException("輸入的體重不合適");
                    }
                    double originalWeight = _weight;
                    _weight = value;
                    if (value > originalWeight)
                    {
                        if (GetFatter != null)
                        {
                            GetFatter(this, EventArgs.Empty);
                        }
                    }
                    else
                    {
                        if (value < originalWeight)
                        {
                            if (GetThinner != null)
                            {
                                GetThinner(this, EventArgs.Empty);
                            }
                        }
                    }
                }
            }
            #endregion
        }
        Woman mary;
        private void Form1_Load(object sender, EventArgs e)
        {

            mary = new Woman("小明", 23, 64.5f);
            mary.GetFatter += new WeightChangedEventHandler(GetfatterHandler);
            mary.GetThinner += GetthinnerHandler;
            System.Console.WriteLine("說明此處是 代碼加載時執行的");
        }
        private void GetfatterHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "變胖了,現在體重" + woman.Weight + "kg.\r\n");
        }
        private void GetthinnerHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "變瘦了,現在體重" + woman.Weight + "kg.\r\n");
        }

        private void button(object sender, EventArgs e)
        {
            double d;
            if(double.TryParse(textBox1.Text,out d))
            {
                try
                {
                    mary.Weight = d;
                }
                catch (ArgumentOutOfRangeException) { }
            }
        }
    }
}

在weight屬性中可以發現調用了事件處理函數,在Form1_Load(object sender, EventArgs e)函數中將對應的事件發生時要執行的函數加載到自身的函數上,這一步纔是整個按鈕執行的關鍵一步,這一步利用了事件的裝訂,來觸發相應的事件執行函數。這個函數是在函數執行時直接加載執行的函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章