一、简介
(非常感谢刘铁猛老师免费视频,让我本来对事件的认识加深了很多)
event ,能够发生的东西,事件的触发必须由事件的拥有者来触发
事件的功能就是: 通知+ 可选的事件参数
事件模型:
1、事件的拥有者(event source 对象) ---事件的源头
2、事件的成员 event 成员 事件本身,----通知功能
3、事件的响应者 event subscribe 对象
4 、事件的处理器 本质上是事件响应者的一个方法回调方法 eventhandler
5、事件的订阅 把事件处理器和事件关联到一起,可以理解是一种以 委托的约定
二、windows 的事件
一个很简单的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace 委托和事件Like
{
class EventExample
{
static void Main(string[] args)
{
//1、 timer 是事件的拥有者
Timer timer = new Timer();
timer.Interval = 1000;
// 3、事件的 响应者 是Boy 这个对象类
Boy boy = new Boy();
Girl girl = new Girl();
// 5、事件订阅
timer.Elapsed += boy.Action;
timer.Elapsed+=girl.Action;
// 2 、事件本身就是 timer.Elapsed 通知功能
timer.Start();
Console.ReadLine();
}
}
class Boy
{
// 4、事件处理器
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine(" Boy sssssssssssss");
}
}
class Girl
{
// 4、事件处理器
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Girl ---sssssssssssss");
}
}
}
一星事件模型:委托和父子窗口通信
B点击窗口--》A显示数据
B窗口:也是是事件源头
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 委托和父子窗口通信
{
public partial class B : Form
{
//1、 委托的定义
public delegate void ChangedTextDelegate(String s);
//2、 声明一个事件 事件本身 通知功能
public static event ChangedTextDelegate ChangedTextevent;
public B()
{
InitializeComponent();
}
// 事件的拥有者
private void button1_Click(object sender, EventArgs e)
{
string aa = "B------>A";
if(ChangedTextevent != null)
{
ChangedTextevent(aa);
}
}
}
}
A 窗口:也就是事件的响应者
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 委托和父子窗口通信
{
public partial class A : Form
{
// 事件的响应者
public A()
{
InitializeComponent();
B f2 = new B();
f2.Show();
// B.ChangedTextevent 就是事件本身 起一个通知的功能 =====2
// mychangeText 是对B中事件的响应
//5 、在A中订阅B中的委托的事件
B.ChangedTextevent += new B.ChangedTextDelegate(mychangeText);
}
//4 、响应事件
public void mychangeText(string s)
{
this.textBox1.Text = s;
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
二星事件
三星: 事件的拥有者是事件的一个字段成员
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// 事件的源头是事件的一个字段 就是button1 这个字段
// 事件的订阅
this.button1.Click += this.Button1myClick;
}
private void Button1myClick(object sender, EventArgs e)
{
this.textBox1.Text = "hell world !!!";
}
}
然后我们可以做一个相互控制的程序:
A:
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;
using static 委托和父子窗口通信.B;
namespace 委托和父子窗口通信
{
//1、 委托的定义
public delegate void ChangedTextA2BDelegate(String s);
//2、 声明一个事件 事件本身 通知功能
public partial class A : Form
{
public static event ChangedTextA2BDelegate ChangedTextA2Bevent;
// 事件的响应者
public A()
{
this.Text = "A";
InitializeComponent();
B f2 = new B();
f2.Show();
// B.ChangedTextevent 就是事件本身 起一个通知的功能 =====2
// mychangeText 是对B中事件的响应
//5 、在A中订阅B中的委托的事件
B.ChangedTextevent += new ChangedTextDelegate(mychangeText);
}
//4 、响应事件
public void mychangeText(string s)
{
this.textBox1.Text = s;
}
private void button1_Click(object sender, EventArgs e)
{
string aa = "A------>B";
if (ChangedTextA2Bevent != null)
{
ChangedTextA2Bevent(aa);
}
}
private void A_Load(object sender, EventArgs e)
{
}
}
}
B:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 委托和父子窗口通信
{
//1、 委托的定义
public delegate void ChangedTextDelegate(String s);
public partial class B : Form
{
//2、 声明一个事件 事件本身 通知功能
public static event ChangedTextDelegate ChangedTextevent;
public B()
{
InitializeComponent();
A.ChangedTextA2Bevent += new ChangedTextA2BDelegate(mychangeText);
}
public void mychangeText(string s)
{
this.textBox1.Text = s;
}
// 事件的拥有者
private void button1_Click(object sender, EventArgs e)
{
string aa = "B------>A";
if(ChangedTextevent != null)
{
ChangedTextevent(aa);
}
}
private void B_Load(object sender, EventArgs e)
{
}
}
}
三、自定义事件
自定义完整的事件声明方式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 委托和事件Like
{
class EventDefine
{
static void Main(string[] args)
{
Constomer constomer =new Constomer();
Waiter waiter = new Waiter();
constomer.Order += waiter.Action;
constomer.MyAction();
constomer.PayBill();
Console.ReadLine();
}
}
public delegate void OrderEventhandler(Constomer c, OrderEventArgs e);
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Constomer
{
private OrderEventhandler orderhandle;
public event OrderEventhandler Order
{
add
{
orderhandle += value;
}
remove
{
orderhandle -= value;
}
}
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
public void Think()
{
Console.WriteLine("Think. ");
Thread.Sleep(5000);
// 如果orderhandle 是空的表示没人订阅
if (this.orderhandle!=null)
{
OrderEventArgs e=new OrderEventArgs();
e.DishName = "沙拉酱";
e.Size = "large";
orderhandle.Invoke(this,e);
}
}
public void MyAction()
{
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Constomer c, OrderEventArgs e)
{
Console.WriteLine("Waiter: I will serve you the dish- {0}", e.DishName);
double price = 10;
switch(e.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill+=price;
}
}
}
事件的简化声明:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 委托和事件Like
{
class EventDefine
{
static void Main(string[] args)
{
Constomer constomer =new Constomer();
Waiter waiter = new Waiter();
constomer.Order += waiter.Action;
constomer.MyAction();
constomer.PayBill();
Console.ReadLine();
}
}
public delegate void OrderEventhandler(Constomer c, OrderEventArgs e);
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Constomer
{
//private OrderEventhandler orderhandle;
//public event OrderEventhandler Order
//{
// add
// {
// orderhandle += value;
// }
// remove
// {
// orderhandle -= value;
// }
//}
public event OrderEventhandler Order;
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
public void Think()
{
Console.WriteLine("Think. ");
Thread.Sleep(5000);
// 如果orderhandle 是空的表示没人订阅
if (this.Order != null)
{
OrderEventArgs e=new OrderEventArgs();
e.DishName = "沙拉酱";
e.Size = "large";
Order.Invoke(this,e);
}
}
public void MyAction()
{
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Constomer c, OrderEventArgs e)
{
Console.WriteLine("Waiter: I will serve you the dish- {0}", e.DishName);
double price = 10;
switch(e.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill+=price;
}
}
}
简单声明的主要地方
//private OrderEventhandler orderhandle;
//public event OrderEventhandler Order
//{
// add
// {
// orderhandle += value;
// }
// remove
// {
// orderhandle -= value;
// }
//}
public event OrderEventhandler Order;
将事件中的event 去掉
// 假如我们吧这里的event 字段去掉 这个就是一个委托了,程序运行,但是会有一个bug
事件的触发必须由事件的拥有者来触发
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 委托和事件Like
{
class EventDefine
{
static void Main(string[] args)
{
Constomer constomer = new Constomer();
Waiter waiter = new Waiter();
constomer.Order += waiter.Action;
OrderEventArgs e1 = new OrderEventArgs();
e1.DishName = "mashaji";
e1.Size = "large";
OrderEventArgs e2 = new OrderEventArgs();
e2.DishName = "niupai";
e2.Size = "large";
// constomer.MyAction();
Constomer badgay = new Constomer();
badgay.Order += waiter.Action;
badgay.Order.Invoke(constomer,e1);
badgay.Order.Invoke(constomer, e2);
constomer.PayBill();
Console.ReadLine();
}
}
public delegate void OrderEventhandler(Constomer c, OrderEventArgs e);
public class OrderEventArgs : EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Constomer
{
//private OrderEventhandler orderhandle;
//public event OrderEventhandler Order
//{
// add
// {
// orderhandle += value;
// }
// remove
// {
// orderhandle -= value;
// }
//}
// 假如我们吧这里的event 字段去掉 这个就是一个委托了,程序运行
// public event OrderEventhandler Order;
public OrderEventhandler Order;
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}", this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
public void Think()
{
Console.WriteLine("Think. ");
Thread.Sleep(5000);
// 如果orderhandle 是空的表示没人订阅
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "沙拉酱";
e.Size = "large";
Order.Invoke(this, e);
}
}
public void MyAction()
{
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Constomer c, OrderEventArgs e)
{
Console.WriteLine("Waiter: I will serve you the dish- {0}", e.DishName);
double price = 10;
switch (e.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill += price;
}
}
}
改正:
只需要改这里就可以l
public class Constomer
{
//private OrderEventhandler orderhandle;
//public event OrderEventhandler Order
//{
// add
// {
// orderhandle += value;
// }
// remove
// {
// orderhandle -= value;
// }
//}
// 假如我们吧这里的event 字段去掉 这个就是一个委托了,程序运行
public event OrderEventhandler Order;
//public OrderEventhandler Order;
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}", this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
事件: 事件是对委托字段的一个包装器,只能是在 订阅上面“+=”或者“-=”
常用事件中我们一般不适用自定义的委托,经常适用windows 自己提供的 EventHandle 做为 一个基础的使用:
// 假如我们吧这里的event 字段去掉 这个就是一个委托了,程序运行
public event EventHandler Order;
对 EventArgs的改造:
public class Waiter
{
internal void Action(Object sender, EventArgs e)
{
Constomer c = sender as Constomer;
OrderEventArgs orderinfo = e as OrderEventArgs;
Console.WriteLine("Waiter: I will serve you the dish- {0}", orderinfo.DishName);
double price = 10;
switch (orderinfo.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill += price;
}
}
全部程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 委托和事件Like
{
class EventDefine
{
static void Main(string[] args)
{
Constomer constomer = new Constomer();
Waiter waiter = new Waiter();
constomer.Order += waiter.Action;
constomer.MyAction();
constomer.PayBill();
Console.ReadLine();
}
}
// public delegate void OrderEventhandler(Constomer c, OrderEventArgs e);
public class OrderEventArgs : EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Constomer
{
public event EventHandler Order;
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}", this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
public void Think()
{
Console.WriteLine("Think. ");
Thread.Sleep(5000);
// 如果orderhandle 是空的表示没人订阅
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "沙拉酱";
e.Size = "large";
Order.Invoke(this, e);
}
}
public void MyAction()
{
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Object sender, EventArgs e)
{
Constomer c = sender as Constomer;
OrderEventArgs orderinfo = e as OrderEventArgs;
Console.WriteLine("Waiter: I will serve you the dish- {0}", orderinfo.DishName);
double price = 10;
switch (orderinfo.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill += price;
}
}
}
最终代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 委托和事件Like
{
class EventDefine
{
static void Main(string[] args)
{
Constomer constomer = new Constomer();
Waiter waiter = new Waiter();
constomer.Order += waiter.Action;
constomer.MyAction();
constomer.PayBill();
Console.ReadLine();
}
}
public class OrderEventArgs : EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Constomer
{
public event EventHandler Order;
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine("I will pay ${0}", this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restarent. ");
}
public void SitDown()
{
Console.WriteLine("SitDown. ");
}
public void Think()
{
Console.WriteLine("Think. ");
Thread.Sleep(5000);
this.OnOrder("messi","large");
}
// 触发事件
protected void OnOrder(string dishName,string size)
{
// 如果orderhandle 是空的表示没人订阅
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = dishName;
e.Size = size;
this.Order.Invoke(this, e);
}
}
public void MyAction()
{
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Object sender, EventArgs e)
{
Constomer c = sender as Constomer;
OrderEventArgs orderinfo = e as OrderEventArgs;
Console.WriteLine("Waiter: I will serve you the dish- {0}", orderinfo.DishName);
double price = 10;
switch (orderinfo.Size)
{
case "small":
price = price * 0.7;
break;
case "middle":
price = price * 1;
break;
case "large":
price = price * 1.3;
break;
}
c.Bill += price;
}
}
}
总结: