事件是一种用于类和类之间传递消息或触发新的行为的编程方式。通过提供事件的句柄,能够把控件和可执行的代码联系在一起,
如用户单击Button控件触发Click事件后就执行相应的事件处理代码。
事件的声明通过委托来实现。先定义委托,再用委托定义事件,触发事件的过程实质是调用委托。事件声明语法格式如下:
public delegate void EventHandler(object sender,EventArgs e);//定义委托
public event EventHandler MyEvent;//定义事件
EventHandler委托定义了两个参数,分别属于object类型和EventArgs类型。如果需要更多参数,可以通过派生EventArgs类实现。
sender表示触发事件的对象,e用于在事件中传递参数。例如,若用户单击Button按钮,则sender表示Button按钮,e表示Click时间参数。
MyEvent事件使用EventHandler委托定义,其中使用了public修饰符,也可以使用private,protected等修饰符。
实例:在AccountEvent类中增加账户金额不足事件并运用事件
AccountEvent类的定义:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5
6
7 public class AccountEvent
8 {
9 private string _ID;
10 private string _Name;
11 private decimal _Balance;
12 //定义Overdraw事件
13 public event EventHandler Overdraw;
14 public void OnOverDraw(object sender, EventArgs e)
15 {
16 if (Overdraw != null)
17 {
18 Overdraw(this,e);
19
20 }
21 }
22 //存款方法
23 public void Deposit(decimal amount)
24 {
25 //先检查存款的金额是否大于0
26 if (amount > 0)
27 {
28 _Balance += amount;
29 }
30 else
31 {
32 throw new Exception("存款的金额不能小于等于0!!");
33 }
34 }
35 //取款方法
36 //并在此方法中加入触发事件的代码
37 public void Acquire(decimal amount)
38 {
39 if (amount < _Balance)
40 {
41 _Balance -= amount;
42 }
43 else
44 {
45 OnOverDraw(this, EventArgs.Empty);
46 return;
47 }
48 }
49
50 public string ID
51 {
52 get { return _ID; }
53 set { _ID = value; }
54 }
55 public string Name
56 {
57 get { return _Name; }
58 set { _Name = value; }
59 }
60 public decimal Balance
61 {
62 get { return _Balance; }
63 set { _Balance = value; }
64 }
65 //构造方法
66 public AccountEvent(string id,string name,decimal balance)
67 {
68 _ID = id;
69 _Name = name;
70 _Balance = balance;
71
72 }
73
74
75 }
至此,已经声明了事件并增加了事件触发点。但若要在ASP.NET页面上使用事件,还需要使用运算符“+=”注册事件,并要编写事件处理代码。
下面是如何运用Overdraw事件。
AccountEventPage.aspx.cs的代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8 public partial class Chap3_AccountEventPage : System.Web.UI.Page
9 {
10 protected void Page_Load(object sender, EventArgs e)
11 {
12 AccountEvent accountEvent = new AccountEvent("03012", "李明", 200);//建立AccountEvent对象,账户初始金额为200
13 //注册Overdraw事件
14 accountEvent.Overdraw += new EventHandler(account_OverDraw);
15 accountEvent.Acquire(400);//取款400
16
17 }
18 //Overdraw事件处理代码
19 private void account_OverDraw(object sender, EventArgs e)
20 {
21 Response.Write("账户金额不足了!!!");
22 }
23 }
浏览AccountEventPage.aspx呈现界面如下:
程序说明:
当程序执行“account.Acquire(400);”时,因为对账户的取款金额大于账户金额,会执行Acquire方法中if语句的else部分,将触发事件Overdraw;再执行account_Overdraw()方法,输出信息“账户金额不足了!!!”。
此例子中事件运用的步骤为:
1.定义事件。
2.设置事件的触发点。
3.使用运算符“+=”注册事件。
4.编写事件处理代码。
其中1、2两步是在类的定义中完成的,3、4步是在aspx文件中完成的的。