温故而知新-----事件
事件概述
类或对象可以通过时间向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
事件特点:
发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
一个事件可以有多个订户。一个订户可以处理来自多个发行者的事件。
没有订户的时间永远不会引发。
事件通常用户通知用户操作,如:图形用户界面中的按钮单击或菜单选择操作。
如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。(可以使用异步方式调用同步方法)。
在.NET Framwork类库中,事件是基于EventHandler委托和EventArgs基类的。
订阅和取消订阅事件
1.使用VS IDE订阅事件
属性→事件→要创建的事件(如Load事件)。
Visual C#会创建一个空事件处理程序方法,并将其添加到你的代码中。你也可以在“代码”视图中手动添加代码。
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 4 }
还会在项目的Form1.Designer.cs文件的InitializaComponent方法中自动生成订阅该事件所需的代码。如下:
1 this.Load += new System.EventHandler(this.Form1_Load);
2.以编程方式订阅事件
定义一个事件处理程序方法,其签名与该事件的委托签名匹配。
1 public Form1() 2 { 3 InitializeComponent(); 4 } 5 6 private void Form1_Load(object sender, EventArgs e) 7 { 8 label2.Text = "加载..."; 9 } 10 void HandleEvent(object sender, EventArgs a) 11 { 12 label1.Text = "使用编程订阅事件!"; 13 }
使用假发赋值运算符(+=)来为事件附加事件处理程序。
1 this.Load += new System.EventHandler(this.Form1_Load); 2 this.Load += new System.EventHandler(this.HandleEvent);
还可以使用Lambda表达式添加事件处理程序:
1 public Form1() 2 { 3 InitializeComponent(); 4 this.Click += (s, e) => 5 { 6 MessageBox.Show( 7 ((MouseEventArgs)e).Location.ToString()); 8 }; 9 }
3.使用匿名方法订阅事件
如果以后不必取消订阅某个事件,则可以使用假发赋值运算符(+=)将匿名方法附加发哦此事件。
1 this.Load += new System.EventHandler(this.Form1_Load); 2 //this.Load += new System.EventHandler(this.HandleEvent); 3 this.Load += new System.EventHandler(delegate(object o, EventArgs e) { label1.Text = "使用匿名方法"; });
一般不建议使用匿名函数订阅事件。
取消订阅事件
使用剪发运算符(-=)取消订阅事件:
1 this.Load -= new System.EventHandler(this.HandleEvent);
所有订户都取消订阅事件后,发行者类中的事件实例将设置为null。