當在點擊一個按鈕執行某個操作時,你有沒有想過,爲什麼點擊了這個按鈕就會執行某個操作,這是爲什麼?那麼接下來就讓我來解開這裏面的祕密。
用微軟中定義的事件函數來說明這個問題是再簡單不過的的事情了。
首先,點擊按鈕是一個事件,也就是說,當你點擊了按鈕就相當於是觸發了一個事件,學過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)函數中將對應的事件發生時要執行的函數加載到自身的函數上,這一步纔是整個按鈕執行的關鍵一步,這一步利用了事件的裝訂,來觸發相應的事件執行函數。這個函數是在函數執行時直接加載執行的函數。