C#事件

事件详情
事件的应用

事件都是被动触发的,当被用到的时候才会被触发

闪电标记的就是事件成员
扳手标记的是属性
方块标记的是方法
一颗星的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| using System; using System.Windows.Forms;
namespace event2 { internal 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 = DateTime.Now.ToString(); } } }
|
两颗星
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| using System; using System.Windows.Forms;
namespace event3 { internal class Program { static void Main(string[] args) { myForm myForm = new myForm(); myForm.Click += myForm.FormClicked; myForm.ShowDialog(); } }
internal class myForm : Form { internal void FormClicked(object sender, EventArgs e) { this.Text = DateTime.Now.ToString(); } } }
|
三颗星(应用最广泛)
事件拥有者是事件响应者的一个字段,成员,事件响应者用自己的方法订阅自己成员的某个事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| using System; using System.Windows.Forms;
namespace event4 { internal class Program { static void Main(string[] args) { MyForm myForm = new MyForm(); myForm.ShowDialog(); } }
class MyForm : Form { public TextBox textBox; public Button button;
public MyForm() { this.textBox = new TextBox(); this.button = new Button(); this.button.Text = "点击"; this.button.Top = 23; this.Controls.Add(textBox); this.Controls.Add(button); this.button.Click += this.buttonClicked; } private void buttonClicked(object sender, EventArgs e) { this.textBox.Text = DateTime.Now.ToString(); } } }
|
其它


这里sender类似于js中的event对象,就是当前执行的方法的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| using System; using System.Windows.Forms;
namespace windowApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.button3.Click += delegate (object sender, EventArgs e) { this.box.Text = "33333"; }; }
private void Btn_Click(object sender, EventArgs e) { if (sender == this.button1) { this.box.Text = "你好"; } if (sender == this.button2) { this.box.Text = "hello"; } }
private void Form1_Load(object sender, EventArgs e) { } } }
|
其他按钮的事件已经在窗口属性那里添加了,都是为Btn_Click方法
和js添加事件的操作差不多
wpf
使用的xaml去修饰页面
事件的声明

声明自定义事件
事件是基于委托的,事件需要一个委托类型,来做一个约束,这个约束即规定了事件能够发送什么样的消息给事件的响应者,这就决定了事件响应值的事件处理器,必须能够跟这个约束匹配上,它才能够订阅上这个事件
完整声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace EventDet { internal class Program { static void Main(string[] args) { Customer customer = new Customer(); Waiter waiter = new Waiter(); customer.Order += waiter.Action; customer.action(); customer.PayTheBill(); Console.ReadLine(); } }
internal class Waiter { internal void Action(Customer customer, OrderEventArgs e) { Console.WriteLine("服务员将给-{0}-上菜", e.DishName); double price = 10; switch (e.Size) { case "small": price = price * 0.5; break; case "large": price = price * 1.5; break; } customer.Bill += price; } } 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}", Bill); } public void action() { if (orderEventHandler != null) { OrderEventArgs e = new OrderEventArgs(); e.DishName = "小明"; e.Size = "large"; orderEventHandler(this, e); } } } }
|
delegate 相当于定义一个函数类型。
event 相当于定义一个 delegate 的函数指针(回调函数指针)。
简略声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace eventDel { internal class Program { static void Main(string[] args) { Customer customer = new Customer(); Waiter waiter = new Waiter(); customer.Order += waiter.Action; customer.action(); customer.PayTheBill(); Console.ReadLine(); } }
internal class Waiter { internal void Action(Customer customer, OrderEventArgs e) { Console.WriteLine("服务员将给-{0}-上菜", e.DishName); double price = 10; switch (e.Size) { case "small": price = price * 0.5; break; case "large": price = price * 1.5; break; } customer.Bill += price; } }
public class OrderEventArgs { public string DishName { get; set; } public string Size { get; set; } }
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
public class Customer { public event OrderEventHandler Order;
public double Bill { get; set; }
public void PayTheBill() { Console.WriteLine("i will pay ${0}", Bill); }
public void action() { if (Order != null) { OrderEventArgs e = new OrderEventArgs(); e.DishName = "小明"; e.Size = "large"; Order(this, e); } } } }
|

总结
三个普通类
- 事件拥有者类
- 上述代码中的Customer类
- 事件响应者类
- 上述代码中的Waiter类
- 传递信息类
- 上述代码中的OrderEventArgs类
一个委托类
上述代码中的OrderEventHandler类
事件是对委托的一种封装机制
