使用场景 举例:A类中new出B类,B类中有UDP接收,当UDP接收到数据,将数据传回A类
实现原理:
B类:
1. 声明关于事件的委托;
2. 声明事件;
3. 对于事件的触发
A类:
1. 实现接收数据的处理方法
2. 将A类的方法与B类的事件 用 B类的委托绑定
代码如下:
public partial class FormB
{
public delegate void AlarmEventHandler(string sender);//声明关于事件的委托,参数为要回传的数据类型
public event AlarmEventHandler Alarm;//声明事件
public void UDP接收数据(string 模拟接收的数据)
{
this.Alarm(模拟接收的数据); //触发事件,发出数据给Alarm所绑定的接收函数
}
}
public partial class FormA
{
FormB B1;
public FormA()
{
B1 = new FormB();
//将FormA类接收处理函数绑定在FormB的Alarm事件上,FormB中所有通过Alarm回传的数据都由FormA的[数据处理]函数进行处理
B1.Alarm += new FormB.AlarmEventHandler(数据处理);
}
void 数据处理(string 数据)//用于接收FormB数据进行处理的函数
{
Console.WriteLine("消息传回来了");
Console.WriteLine(数据);
}
}
测试一下:
private void button1_Click(object sender, EventArgs e)
{
B1.UDP接收数据("AAA");
}
打印:
可以看出 由FormB的 'UDP接收数据' 函数接收到数据,传给了FormA的 '数据处理' 函数.
第二种方法,将回调方法以参数的方式传入到到函数中(推荐)
父类:
public Form1()
{
InitializeComponent();
Form2 f2 = new Form2();
//将"DataProcessing"方法以参数方式传入到
f2.addBtn(DataProcessing);
f2.Show();
}
//回调函数进行数据处理
public void DataProcessing(int a1)
{
Console.WriteLine(a1);
}
子类:
public Action<int> Alarm;
public Form2()
{
InitializeComponent();
}
public void addBtn(Action<int> alarm1)
{
Button btn = new Button();
int ttt = 2;
btn.Click += (s, args) =>//设置点击触发回调函数
{
//这里写触发回调函数
alarm1(ttt); //触发事件,发出数据给Alarm所绑定的接收函数
//Alarm = alarm1;//或赋予全局,以便在其他函数调用
//Alarm(ttt);
};
this.Controls.Add(btn);
}
效果如下: