事件
事件
事件就是封装了委托;
定义一个事件,自动生成了一个私有的委托,还有个委托的方法,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. 调用事件
Player
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);
}
}
}
Program
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这个类就是一个“鸡肋”,它就是一个父类,让别的类去继承它。
现在事件我们应该都明白了,可以写一个自定的事件,让上面那个播放器的显示正在播放的歌曲:
View Code
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)); } } }
View Code
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+"播放结束"); } }
事件
浙公网安备 33010602011771号