C# 事件

事件五个部分:

事件,事件响应者,事件拥有者,事件处理器,事件的订阅

例1:一星情况 事件响应者和事件拥有者是两个不同的对象

事件拥有者:form

事件:Click

事件响应者:controller

事件处理器:FormClick方法

事件的订阅:+=操作符

using System;
using System.Windows.Forms;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        Form form = new Form();
        Controller controller=new Controller(form);
        form.ShowDialog();
        }
    }
    class Controller
    {
        private Form form;
        public Controller(Form form)
        {
            if (form != null)
            {
                this.form = form;
                this.form.Click += this.FormClicked;

            }


        }

        private void FormClicked(object sender, EventArgs e)
        {
           this.form.Text= "你好";
        }
    }

}

例2:两星的情况,特点是事件的拥有者和事件的响应者是同一个对象,即一个对象拿着自己的方法去订阅和处理自己的事件

事件拥有者:form
事件:Click
事件响应者:form
事件处理器:FormClicked方法
事件的订阅:+=操作符

using System;
using System.Windows.Forms;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Myform form=new Myform();
            form.Click += form.FormClicked;
            form.ShowDialog();
           
        }
    }
    class Myform : Form
    {
        internal void FormClicked(object sender, EventArgs e)
        {
            this.Text = "我好";
        }
    }

}

例3:三星的情况,事件的拥有者是事件响应者的一个字段成员,事件的响应者用自己的方法订阅自己的成员的某个事件

事件拥有者:button
事件:Click
事件响应者:MyForm对象:form
事件处理器:ButtonClicked方法
事件的订阅:+=操作符

using System;
using System.Windows.Forms;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyForm form = new MyForm();
            form.ShowDialog(); 
           
        }
    }
  class MyForm:Form
    {
        private TextBox textBox;
        private Button button;

        public MyForm()
        {
            this.textBox = new TextBox();
            this.button = new Button(); 
            this.Controls.Add(this.button);
            this.Controls.Add(this.textBox);
            this.button.Click += this.ButtonClicked;
            this.button.Text = "say hello";
            this.button.Top = 50;
        }

        private void ButtonClicked(object sender, EventArgs e)
        {
            this.textBox.Text = "Hello";
        }
    }
}

--------------------------------------------------------------------------------------------------------------------------------

自己声明事件(可能需要自己声明委托)

事件完整声明方式

例:餐厅点菜

定义一个用来传递事件消息的类:

public class OrderEventArgs:EventArgs//规定用途作为EventArgs来使用需派生至EventArgs

 {

  public string DishName { get; set; }//菜的信息,下面要用
  public string Size { get; set; }

}

该委托为了Order这个事件准备的:两个参数一个是顾客,一个是菜的信息

声明委托:public delegate void OrderEvenHandler(Customer customer,OrderEventArgs e)

定义顾客类:

public class Customer

 {

private OrderEventHandler orderEventHandler;//委托字段,用来引用事件处理器(相当于用委托来引用方法)

public event OrderEventHandler  Order//Order事件由OrderEventHandler约束

   {

              add 
          {
             this.orderEventHandler += value;
          }
          remove
         {
            this.orderEventHandler -= value;
         }

    }

}

现在事件拥有者:customer,事件:order ,还差事件响应者 事件处理器 事件订阅

事件响应者:public class Waiter  //waiter又包含事件处理器即一个动作Action

         {

               public void Action(Customer customer, OrderEventArgs e)//负责上菜和记账

                    {--------------------------------

                       --------------------------------- } 

         }

Main中

{

 Customer customer = new Customer();
 Waiter waiter = new Waiter();
 customer.Order += waiter.Action;

}//全部元素已齐

事件拥有者:customer,事件:Order,事件的响应者:waiter,

事件处理器:waiter.Action,事件的订阅:+=

现需在Customer类中触发事件:

if(this.orderEventHandler != null)
{    
     OrderEventArgs e=new OrderEventArgs();
     e.DishName = "辣椒炒肉";
     e.Size = "large";
     this.orderEventHandler.Invoke(this, e);

//this为Customer下的委托字段即触发了Order事件然后因为waiter的Action订阅了Customer的Order,所以waiter的事件处理器Action触发即Action注释的负责上菜和记账
}

完整代码:

using System;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace ConsoleApp1
{
   class Program
    { 
        static void Main(string[] args)
        {
           Customer customer = new Customer();
           Waiter waiter = new Waiter();
           customer.Order += waiter.Action;
           customer.Action();
           customer.PayTheBill();

        }
    }

    
  public class  OrderEventArgs:EventArgs
    {
        public string DishName { get; set; }
        public string Size { get; set; }

    }
    public delegate void OrderEventHandler(Customer customer,OrderEventArgs e);

  public class Customer
    {
     private OrderEventHandler orderEventHandler;

     public event OrderEventHandler Order
     {
         add 
         {
            this.orderEventHandler += value;
         }
         remove
         {
            this.orderEventHandler -= value;
         }
     }


      public double Bill { get; set; }
      public void PayTheBill()
      {
          Console.WriteLine("i will pay{0}", this.Bill);
      }
 
      public void walkIn()
      {
      Console.WriteLine("Walk into the restaurant");
      }
      public void SitDowm()
      {
       Console.WriteLine("Sit Dowm");
      }

      public void Think()
      {
 
        Console.WriteLine("let me think");
        if(this.orderEventHandler != null)
        {    
             OrderEventArgs e=new OrderEventArgs();
             e.DishName = "辣椒炒肉";
             e.Size = "large";
             this.orderEventHandler.Invoke(this, e);
        }
      }
      public void Action()
        {
            Console.ReadLine();
            this.walkIn();
            this.SitDowm();
            this.Think();
        }
 }


 public class Waiter
    {
        public void Action(Customer customer, OrderEventArgs e)
        {
            Console.WriteLine("i will server you the dish{0}",e.DishName);
            double price = 10;
            switch(e.Size)
            {
                case "small":
                    price = price * 0.5;
                    break;
                case "large":
                    price = price * 1.5; 
                    break;
                default:
                    break;
            }
            customer.Bill += price; 

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值