事件

事件
事件就是封装了委托;

定义一个事件,自动生成了一个私有的委托,还有个委托的方法,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+"播放结束");
        }
    }

  


     

原文地址:https://www.cnblogs.com/hejinyang/p/2804769.html