![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
事件就是封装了委托; 定义一个事件,自动生成了一个私有的委托,还有个委托的方法,addEvent 跟 removeEvent; 怎么使用事件的列子: 1.public event EventHandler TriggerClick;//定义一个事件 2.在用户定义的控件里使用该事件: if(TriggerClick!=null)//触发事件之前先判断事件是否注册了(是否+=了) { TriggerClick(this,e); } //注册事件(其实就是给事件所指向委托添加方法) 3.triggerButton1.TriggerClick += new EventHandler(triggerButton1_TriggerClick); void triggerButton1_TriggerClick(object sender,EventArgs e){ } 用委托实现事件做的: 1. public delegate void DelTriggerClick(object a, object b); private DelTriggerClick delTrigger; public void AddEvent(DelTriggerClick delTrigger) { this.delTrigger += delTrigger; } public void RemoveEvent(DelTriggerClick delTrigger) { this.delTrigger -= delTrigger; } 2. if (delTrigger != null) { delTrigger(sender, e); } 3. ucDelTriggerClick2.AddEvent(Trigger); void Trigger(object a, object b) { MessageBox.Show("你点了3次!"); }
遇到比较难理解的内容时,我们就把它最简单的用法弄明白,再逐渐学习它的一些真正有用的内容。
事件的作用就是来帮你完成任务,完成你想做得事。假如我们想点击一个按钮时弹出一个对话框,点击播放按钮时它就播放音
乐, 也就是说我们点一个按钮后想要实现什么效果,就可以用事件来帮我们完成。
我们知道了事件可以帮我们做我们想做的事情,那么事件怎么用呢?它需要什么条件呢?
很简单,要把大象装冰箱,总共分几步?答案,3步:
1. 定义事件
2. 注册事件
3. 调用事件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Player { // 1 定义事件 (播放完之后要做什么由调用的来决定,是播放下一首,还是关闭等等。。。 ) public event EventHandler PlayOver; public Player() { } public Player(string name) { this.name = name; } private string name; public string Name { get { return name; } set { name = value; } } public void Play() { Console.WriteLine("正在播放"); if(PlayOver!=null) { //2. 调用事件 PlayOver(this, null); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { Player play = new Player("想你的夜"); // 3.注册事件(给事件的委托加方法,播放完是结束,还是进行一下一首。。。) play.PlayOver += new EventHandler(play_PlayOver); play.Play(); } static void play_PlayOver(object sender, EventArgs e) { Console.WriteLine("播放结束"); } }
事件就是这么简单,我们在学习知识的时候总是会遇到让我们弄不懂的地方,为什么有的人可以快速的学会,有的人却怎么学都感觉不会,总是感觉有一层迷雾遮住了你的思想,让你想不通,看不透,其实只要我们自己认为自己可以做到,就一定可以做到,如果你自己都认为自己做不到,或者是想时间久了就自然明白了,那么这个问题也许就会一直迷雾着你,让你永远看不透。有些东西,你说难,它就难,不难也难!你说易,它就易,难也不难!如果我们把每个问题都当做是老虎,你不解决它,它就吃了你,那么我想你就第二个武松,第二个爱因斯坦,因为很少会有人想问题把自己想死的吧,问题是你创造的,你就是创世主,当然也有解决它的能力!
回到正题:我们来看看下面这些东西
private void button1_Click(object sender, EventArgs e)
private void Form1_Load(object sender, EventArgs e)
private void textBox1_TextChanged(object sender, EventArgs e)
你会感慨的说:“我靠,怎么这么熟?!”
单机按钮,就会触发事件,系统就会自动调用该事件的处理程序button1_Click(),我们把触发事件的对象称为事件的发送者(Event Sender),响应事件的对象称为事件的接受者(Event Receiver). 我们点击按钮弹出一个消息框,那么,事件的发送者就是按钮,事件的接受者就是窗体From1.
当事件发生时,系统是如何找到对应的事件处理程序呢?原来.NET以委托机制运行事件处理程序。.NET中预先定义了许多种专门用于事件的委托类型,比如EventHandler、KeyEventHandler、MouseEventHandler等。
我们查看Control类,就会发现该类定义了大量事件成员:
其中有我们很熟悉的Click、DoubleClicks、MouseMove、MouseClick等。
public event EventHandler Click
public event EventHandler DoubleClick
public event EventHandler Enter
public event MouseEventHandler MouseMove
public event MouseEventHandler MouseClick
从声明过程中可以看出,“事件”实际上就是一个委托的实例,只是声明事件时必须用event关键字,因为.NET中所以控件都继承于Control类,故所有的控件都拥有这些事件。
当我们在类From1中定义了button1_Click()函数之后,系统怎么知道这个函数就是button1的Click事件处理程序呢?原来系统通过下面的语句把函数button1_Click()注册到button1.Click事件中。
this.button1.Click += new System.EventHandler(this.button1_Click);
打开Windows 窗体设计器生成的代码,我们拖到窗体上的所以控件都帮我们自动生成了
从上面的注册事件,我们可以看出,事件能指向什么方法,就是通过委托来决定的,我们来看一下Click事件的EventHandler委托:
public delegate void EventHandler(object sender, EventArgs e);
你又会感慨:“我靠,怎么这么熟悉?!” 对,你用了“又”,所以在来看一下上面你所感慨的东西。
private void button1_Click(object sender, EventArgs e)
现在终于知道为什么button1_Click()这个的函数的参数是(object sender, EventArgs e),返回值是void了吧!
原来根源就在Click事件的委托的签名就是这个样子。
参数: 这个委托的函数接收两个参数,一个是发送事件的发送者,一个是事件本身的参数。
sender发送者,点按钮,那么sender就是按钮,点鼠标,那么sender就是鼠标这个对象。
EventArgs这个类就是一个“鸡肋”,它就是一个父类,让别的类去继承它。
现在事件我们应该都明白了,可以写一个自定的事件,让上面那个播放器的显示正在播放的歌曲:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class SongEventArgs : EventArgs { public SongEventArgs() { } public SongEventArgs(string name) { this.name = name; } private string name; public string Name { get { return name; } set { name = value; } } } delegate void PlayOverEventHandler(object sender, SongEventArgs e); class Player { // 1 定义事件 (播放完之后要做什么由调用的来决定,是播放下一首,还是关闭等等。。。 ) public event PlayOverEventHandler PlayOver; public Player() { } public Player(string name) { this.name = name; } private string name; public string Name { get { return name; } set { name = value; } } public void Play() { Console.WriteLine("正在播放"+this.name); if(PlayOver!=null) { //2. 调用事件 PlayOver(this,new SongEventArgs(this.name)); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Program { static void Main(string[] args) { Player play = new Player("想你的夜"); // 3.注册事件(给事件的委托加方法,播放完是结束,还是进行一下一首。。。) play.PlayOver += new PlayOverEventHandler(play_PlayOver); play.Play(); Console.Read(); } static void play_PlayOver(object sender, SongEventArgs e) { Console.WriteLine(e.Name+"播放结束"); } }