c# 事件



已有系统事件的使用:
class Program
{
static void Main(string[] args)
{
Form b = new Form();
MyForm c = new MyForm(b);
c.myform.ShowDialog();
}
}
public class MyForm
{
public Form myform;
public Button mybutton;
public MyForm( Form a)
{
this.myform = a;
this.mybutton = new Button();
mybutton.Text = "bt";
//form面板里面添加控件
myform.Controls.Add(mybutton);
//声明事件,+=方法名
mybutton.Click +=Myclick ;
}
/// <summary>
/// 事件处理器,vs自动填充
/// </summary>
/// <param name="sender">事件拥有者</param>
/// <param name="e">事件参数</param>
public void Myclick(object sender, EventArgs e)
{
MessageBox.Show("ok");
}
}
自定义事件使用:
1.首先要定义一个委托
2.再用这个委托定义一个事件
3.在这个类里面写上执行事件的方法(因为不可以直接在这个类以外的地方调用)
4.使用+=的方法去添加事件(先要实例化这个类,然后,实例化好的类.事件+=new 类.委托(执行要执行的方法))
5.调用这个类里面执行事件的函数
Eventhandler是系统预设的委托类型,一般用这个就可以了。不用自定义
事件的触发函数一般应为protect或者private,防止事例违法访问
public:公有访问,不受任何限制。
private:私有访问,只限于本类成员访问,子类、实例都不能访问。
protected:保护访问,只限于本类和子类访问,实例不能访问。
internal:内部访问,只限于本项目内访问,其他不能访问。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsoleApp1
{
//点菜的例子
//声明一个点菜的事件委托,一般不需要,系统再带eventhandler就够用
public delegate void OderEventHandler(object order, EventArgs args);
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("顾客进入...请您点菜");
string ordername = Console.ReadLine();
int count = Convert.ToInt32(Console.ReadLine());
//展示
Waiter waiter = new Waiter(ordername, count);
waiter.Show();
//给厨房下单
ChuFang chufang = new ChuFang();
//事件的约定
waiter.ToMakeEvent += chufang.Order_makecf;
//事件的触发,只能是拥有者waiter触发
waiter.Action();
Console.ReadLine();
}
/// <summary>
/// 自定义事件参数
/// </summary>
public class OrderEventArgs : EventArgs
{
public string DishName { get; set; }
public int Count { get; set; }
}
/// <summary>
/// 服务员类
/// </summary>
public class Waiter
{
public string Ordername { get; set; }
public int Count { get; set; }
//事件,本质是委托字段的蒙版,只保留add和remove方法
public event OderEventHandler ToMakeEvent;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="ordername">菜名</param>
/// <param name="count">数量</param>
public Waiter(string ordername, int count)
{
this.Ordername = ordername;
this.Count = count;
}
public void Show()
{
Console.WriteLine($"您点是{this.Ordername},数量为{this.Count}");
}
//事件只能内部触发,外部调用事件的字段只能连接+=或者—=操作,
//如果是委托字段那就可以外部调用委托方法,所以说事件更安全,事件是委托蒙版只保留add和remove的方法
/// <summary>
/// 事件触发函数的防火墙
/// </summary>
public void Action()
{
Console.WriteLine("正在向厨房下单,稍等...");
OnAction();
}
/// <summary>
///事件触发函数,修饰为protect或者private只能本类内部访问,实例不能访问
/// </summary>
private void OnAction()
{
//参数eventargs类,传入
OrderEventArgs orderargs = new OrderEventArgs
{
Count = Count,
DishName = Ordername
};
//触发事件,object一般为this
ToMakeEvent?.Invoke(this, orderargs);
}
}
//厨房接受参数,进行处理
public class ChuFang
{
public void Order_makecf(object o, EventArgs e)
{
//as进行类型强制转换,不成功则null,如果不想转换,参数直接用OrderEventArgs e
OrderEventArgs e2 = e as OrderEventArgs;
OrderEventArgs d2 = o as OrderEventArgs;
Console.WriteLine($"后厨已经收到订单 {e2.DishName},数量为{e2.Count},正在制作...");
}
}
}
}
lamd一次性写法:


浙公网安备 33010602011771号