
事件五个部分:
事件,事件响应者,事件拥有者,事件处理器,事件的订阅

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

被折叠的 条评论
为什么被折叠?



