事件Event的解释
能够发生什么事情,用于对象或者类之间的动作协调与信息传递。
发生——响应中的5个动作
- 我有一个事件A
- 一个人或者一群人关系我这个事件
- 我这个事件发生了
- 关心我这个事件的人会被依次通知到
- 被通知到的人拿到事件信息(又称“事件数据”“事件参数”“通知”)对事件进行响应,这叫处理事件
使用场景
一般多用于左面,手机等开发的客户端,因为这些程序经常是用户通过事件来驱动的,winform开发里面的控件,按钮啊,下拉框啊,单选框等控件,都有很多事件,点击,选择,双击,改变等。用户通过这个事件来响应不同的代码。
联动解释
点击button按钮,执行A方法,在A方法里面可以获取这个点击事件的一些信息,进行处理。
这句话解释成上面的发生——响应就是
- button有一个事件click
- A方法关注了button的click事件,或许可以再来几个方法,点击button执行ABCD方法也可以
- 点击了button后,click事件就发生了
- A方法被通知到了,执行了A方法
A方法可以拿到这个 click事件的信息,进行处理,也可以不处理
事件的五个部分
事件的拥有者
- 事件
- 事件响应者
- 事件处理器
- 事件订阅
事件的使用
关于事件参数: object sender:是事件的拥有者 EventArgs e:事件参数
简单例子1
class Program{static void Main(string[] args){//timer是事件的拥有者Timer timer = new Timer();timer.Interval = 1000;//事件的订阅者A a = new A();B b = new B();//A.Action是事件处理器,timer.Elapsed是每隔一段时间内执行一次的事件//用+=符号把两个绑在一起//A.Action的简便方法,硬写完后IDE自动提醒你生成这个方法//Action名字随意,可以叫其他的timer.Elapsed += a.Action;timer.Elapsed += b.Action;timer.Start();Console.ReadLine();}}class A{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("A执行了一次");}}class B{internal void Action(object sender, ElapsedEventArgs e){Console.WriteLine("B执行了一次");}}
简单例子2
static class Program{static void Main(){//form:事件的拥有者//Click:事件//a:事件的响应者//FormClicked:事件的处理器//this.form.Click += this.FormClicked;:事件订阅Form form = new Form();A a = new A(form);form.ShowDialog();}}class A{private Form form;public A(Form form){if (form != null){this.form = form;this.form.Click += this.FormClicked;}}private void FormClicked(object sender, EventArgs e){this.form.Text = DateTime.Now.ToString();}}
自定义事件
完整声明例子
class Program{static void Main(string[] args){//一个顾客,一个服务员Customer customer = new Customer();Waiter waiter = new Waiter();//事件订阅customer.Order += waiter.Action;//现在顾客开始点菜,点菜事件完成后,客户过得账单就更新了customer.dian_cai();customer.PayTheBill();Console.ReadLine();}}//服务员相当于订阅者public class Waiter{public void Action(Customer customer, OrderEventArges e){//订阅者可以通过事件传过来的参数获取事件信息Console.WriteLine("我给你上菜{0}",e.Cai_Name);//根据菜的大小,算钱double price = 10;switch (e.Size){case "小":price = price * 0.5;break;case "大":price = price * 1.5;break;default:break;}//算完前给顾客加上customer.Bill += price;}}//一个客人类,里面有个方法,点菜了给账单付钱//顾客是事件拥有者,事件肯定在顾客里面啊,而且触发事件也在顾客内部触发public class Customer{private OrderEventHandler orderEventHandler;//声明一个事件,用OrderEventHandler委托类型来约束这个是事件//里面必须写两个东西,一个添加器add,一个移除器removepublic event OrderEventHandler Order{add{this.orderEventHandler += value;}remove{this.orderEventHandler -= value;}}public double Bill { get; set; }public void PayTheBill(){Console.WriteLine("我要付钱{0}", Bill);}//顾客做了这个操作,就触发事件public void dian_cai(){if (this.orderEventHandler != null){OrderEventArges e = new OrderEventArges();e.Cai_Name = "糖醋排骨";e.Size = "大";this.orderEventHandler.Invoke(this,e);}}}//声明一个【点菜事件】的参数类,继承EventArgs基类。包含了参数菜名,大份小份public class OrderEventArges : EventArgs{public string Cai_Name { get; set; }public string Size { get; set; }}//声明一个点菜事件的委托,第一个参数是事件的拥有者顾客,第二个参数是点菜事件的参数//为啥用EventHandler后缀,别人一看到这个后缀就知道这个委托是用来声明事件的,四个字约定俗成public delegate void OrderEventHandler(Customer customer, OrderEventArges e);
简略声明例子
class Program{static void Main(string[] args){//一个顾客,一个服务员Customer customer = new Customer();Waiter waiter = new Waiter();//事件订阅customer.Order += waiter.Action;//现在顾客开始点菜,点菜事件完成后,客户过得账单就更新了customer.dian_cai();customer.PayTheBill();Console.ReadLine();}}//服务员相当于订阅者public class Waiter{public void Action(object sender, EventArgs e){//转换一个事件拥有者和事件参数Customer customer = sender as Customer;OrderEventArges oe = e as OrderEventArges;//订阅者可以通过事件传过来的参数获取事件信息Console.WriteLine("我给你上菜{0}",oe.Cai_Name);//根据菜的大小,算钱double price = 10;switch (oe.Size){case "小":price = price * 0.5;break;case "大":price = price * 1.5;break;default:break;}//算完前给顾客加上customer.Bill += price;}}//一个客人类,里面有个方法,点菜了给账单付钱//顾客是事件拥有者,事件肯定在顾客里面啊,而且触发事件也在顾客内部触发public class Customer{//客户直接声明一个事件,用C#自带的EventHandler委托基类限制这个事件public event EventHandler Order;public double Bill { get; set; }public void PayTheBill(){Console.WriteLine("我要付钱{0}", Bill);}//顾客做了这个操作,就触发事件public void dian_cai(){if (this.Order != null){OrderEventArges e = new OrderEventArges();e.Cai_Name = "糖醋排骨";e.Size = "大";this.Order.Invoke(this,e);}}}//声明一个【点菜事件】的参数类,继承EventArgs基类。包含了参数菜名,大份小份public class OrderEventArges : EventArgs{public string Cai_Name { get; set; }public string Size { get; set; }}//不用自己声明委托了,用C#自带的基委托//声明一个点菜事件的委托,第一个参数是事件的拥有者顾客,第二个参数是点菜事件的参数//为啥用EventHandler后缀,别人一看到这个后缀就知道这个委托是用来声明事件的,四个字约定俗成//public delegate void OrderEventHandler(Customer customer, OrderEventArges e);
