C# 事件

一、简介

(非常感谢刘铁猛老师免费视频,让我本来对事件的认识加深了很多)

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;
        }
    }
}

总结:

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值