namespace _004_事件
{
//事件时对象在外界的"刺激"下发生的事情,而对外提供的一种消息机制
//事件的两个参与者
//发送者,即对象本身,当本身状态发生变化时,触发事件,并通知事件的接受者
//接收者,用来处理事件,在事件发送者触发一个事件后,会自动执行的内容
//【主窗体接收子窗体消息****】1-声明委托,要放在类的外面,在主窗体还是子窗体声明都可以
public delegate void delRecMsg(string Recmsg, string childName);
//【****主窗体向子窗体发送消息】1-声明委托,要放在类的外面,在主窗体还是子窗体声明都可以
public delegate void delSendMsg(string Sendmsg);
public partial class FrmMain : Form
{
//【****主窗体向子窗体发送消息】3-定义事件变量
public event delSendMsg SendMsgEvent;//将事件定义为委托类型
public FrmMain()
{
InitializeComponent();
}
#region 【主窗体接收子窗体消息****】
//【主窗体接收子窗体消息****】2-编写事件响应方法
private void ShowMsg(string msg, string childName)
{
this.txtMainRecieveMsg.Text += $"{childName}的消息:{msg}\r\n";//回车换行
}
#endregion
#region 【****主窗体向子窗体发送消息】
private void btMainSend_Click(object sender, EventArgs e)
{
//【****主窗体向子窗体发送消息】5-激发事件(使用事件变量调用关联的方法)
//相当于调用子窗体中的frmChild.PassMsg方法,并将参数进行传递
SendMsgEvent(this.txtMainSendMsg.Text.Trim());
}
private void btFrmChild_Click(object sender, EventArgs e)//创建窗体
{
for (int i = 1; i < 4; i++)
{
FrmChild frmChild = new FrmChild($"这是第{i}个子窗体");//创建子窗体时给子窗体添加标题
frmChild.Show();
//【主窗体接收子窗体消息****】4-关联具体方法(委托变量和具体方法关联)(在调用的类中紧跟着对象的类写)
//将事件变量与方法进行关联,左边是委托变量,右边是方法
frmChild.RecmsgEvent += ShowMsg;
//【****主窗体向子窗体发送消息】4-关联具体方法(委托变量和具体方法关联)(在调用的类中紧跟着对象的类写)
SendMsgEvent += frmChild.PassMsg;
//每次创建窗体时把窗体加到list集合中
//this.list.Add(frmChild);
}
}
#endregion
}
}