第九章(1)-事件处理机制-学习笔记
来源:互联网 发布:小野妹子学吐槽 淘宝 编辑:程序博客网 时间:2024/06/08 15:04
激发与响应事件的载体都是对象。“事件源”激发,“响应者”响应事件,且提供“事件响应或处理方法”。一个事件可以没有响应者,后有多个响应者,当事件发生时计算机会检查有无响应者,有的话调用它的事件响应方法。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ConsoleApplication3{ public delegate void MyEventDelegate(int value); public class EventSource//事件源 { public MyEventDelegate handlers;//响应者清单 } public class EventResponsor//事件响应者 { public void MyMethod(int i)//事件响应方法 { Console.WriteLine(i); } } class Program { static void Main(string[] args) { EventSource es = new EventSource();//事件源对象 EventResponsor er1 = new EventResponsor();//两个事件响应者 EventResponsor er2 = new EventResponsor(); es.handlers = Delegate.Combine(es.handlers, new MyEventDelegate(er1.MyMethod)) as MyEventDelegate; es.handlers = Delegate.Combine(es.handlers,new MyEventDelegate(er2.MyMethod)) as MyEventDelegate; //es.handlers += new MyEventDelegate(er1.MyMethod); //es.handlers += new MyEventDelegate(er2.MyMethod); //es.handlers += er1.MyMethod; //es.handlers += er2.MyMethod; //es.handlers =(MyEventDelegate)Delegate.Combine(es.handlers, new MyEventDelegate(er1.MyMethod)); //MyEventDelegate mine = new MyEventDelegate(er1.MyMethod); //mine = es.handlers + mine; es.handlers(10); } }}
注意:在上述代码中事件的激发是es.handlers(10);这个语句很显然他是在Main函数中引发的,但是真实的事件应该是事件源本身引发,却不应该是外界(Main)引发。为了限制事件的激发只能在事件源对象自己引发,c#中引入了新的关键字“event”。
对上面的代码进行改动:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ConsoleApplication3{ public delegate void MyEventDelegate(int value); public class EventSource { public event MyEventDelegate handlers;//响应者清单 public void FireEvent() { if (handlers!=null) { handlers(10); } } } public class EventResponsor { public void MyMethod(int i)//事件响应方法 { Console.WriteLine(i); } } class Program { static void Main(string[] args) { EventSource es = new EventSource();//事件源对象 EventResponsor er1 = new EventResponsor();//两个事件响应者 EventResponsor er2 = new EventResponsor(); //这时不能用委托的静态组合方法Combine了只能使用+=运算符实现追加多路委托 //es.handlers = Delegate.Combine(es.handlers, new MyEventDelegate(er1.MyMethod)) as MyEventDelegate; //es.handlers = Delegate.Combine(es.handlers,new MyEventDelegate(er2.MyMethod)) as MyEventDelegate; es.handlers += new MyEventDelegate(er1.MyMethod); es.handlers += new MyEventDelegate(er2.MyMethod); //es.handlers += er1.MyMethod; //es.handlers += er2.MyMethod; //es.handlers =(MyEventDelegate)Delegate.Combine(es.handlers, new MyEventDelegate(er1.MyMethod)); //MyEventDelegate mine = new MyEventDelegate(er1.MyMethod); //mine = es.handlers + mine; //声明为事件的委托不能直接调用 //es.handlers(10); es.FireEvent(); } }}
一个事件可以有多个响应方法,反过来,一个方法也可以响应多个事件。
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 WindowsFormsApplication4{ public partial class Form1 : Form { public Form1() { InitializeComponent(); foreach (Control ctl in groupBox1.Controls) { if (ctl is TextBox) { (ctl as TextBox).KeyDown += this.EnterToTab; } } } private void EnterToTab(Object sender,KeyEventArgs e) { TextBox txt = null; if (e.KeyCode==Keys.Enter) { groupBox1.SelectNextControl(sender as Control,true,true,true,true); txt = (sender as TextBox); if (txt != null) txt.SelectAll(); } } }}
在四个textbox控件中按enter移动焦点。
0 0
- 第九章(1)-事件处理机制-学习笔记
- 第九章(2)-定义自己的事件-学习笔记
- 第九章(4)-事件访问器-学习笔记
- Android学习笔记— 事件处理机制(一)
- Android学习笔记— 事件处理机制(一)
- Java学习笔记(AWT 之 事件处理机制)
- Cocos2d-x学习笔记(九)-------->Touch事件处理机制
- Android学习笔记— 事件处理机制(一)
- Android学习笔记-事件处理机制
- android学习笔记之事件处理机制
- Java学习笔记-------事件处理机制
- Android学习笔记-事件处理机制
- JavaScript学习笔记之事件处理机制
- Cocos2d-x学习笔记—事件处理机制
- Android学习笔记042之事件处理机制
- Android学习笔记四十二之事件处理机制
- 第九章(3)-开发拥有自定义事件的控件-学习笔记
- View机制深入学习(五) 事件处理机制一
- Codeforces 607A Chain Reaction 【二分 + dp】
- Ubuntu 15.10创建桌面快捷方式、启动器
- Intersection of Two Linked Lists 判断两个单链表里边有没有重叠,返回重叠的第一个节点
- 在CentOS 6.6 64bit上安装vim智能补全插件YouCompleteMe
- JDBC部分回顾注意点
- 第九章(1)-事件处理机制-学习笔记
- sslsocket双向验证通信及单向验证通信
- Oracle中存储器(procedure)和触发器(trigger)的小例子
- android入门_采用HttpURLConnection的GET方式实现登陆案例
- C++对象在内存中的存储
- Linux下dpkg命令的使用
- 遍历逻辑卷
- 绿色安装MY_SQL
- 共勉