namespace _003_基于Delegate实现窗体间信息交互
{
    //子窗体向主窗体发送数据,主窗体接收数据,在主窗体中可以通过delSendMsg方法实现信息接收,
    //但是子窗体不能直接访问delSendMsg方法,且子窗体的信息不能直接给到msg,所以需要通过委托的方式来实现
    //【主窗体接收子窗体消息****】1-声明委托,要放在类的外面,在主窗体还是子窗体声明都可以
    public delegate void delRecMsg(string Recmsg,string childName);
    //【****主窗体向子窗体发送消息】1-声明委托,要放在类的外面,在主窗体还是子窗体声明都可以
    public delegate void delSendMsg(string Sendmsg);
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }
        #region 主窗体接收子窗体消息        
        //【主窗体接收子窗体消息****】2-根据委托编写具体方法(在调用的类中写)
        private void ShowMsg(string msg,string childName)
        {
            this.txtMainRecieveMsg.Text += $"{childName}的消息:{msg}\r\n";//回车换行
        }
        private void btFrmChild_Click(object sender, EventArgs e)
        {
            for (int i = 1; i < 4; i++)
            {
                FrmChild frmChild = new FrmChild($"这是第{i}个子窗体");//创建子窗体时给子窗体添加标题
                frmChild.Show();
                //【主窗体接收子窗体消息****】4-关联具体方法(委托变量和具体方法关联)(在调用的类中紧跟着对象的类写)
                //将委托变量的与方法进行关联,左边是委托变量,右边是方法            
                frmChild.Recmsg += ShowMsg;
                //【****主窗体向子窗体发送消息】4-关联具体方法(委托变量和具体方法关联)(在调用的类中紧跟着对象的类写)
                SendMsg += frmChild.PassMsg;
                //每次创建窗体时把窗体加到list集合中
                this.list.Add(frmChild);
            }           
        }
        #endregion
        #region 主窗体向子窗体发送消息
        //【****主窗体向子窗体发送消息】3-创建委托变量(那里使用那里定义)
        private delSendMsg SendMsg;
        private void btMainSend_Click(object sender, EventArgs e)
        {
            //【****主窗体向子窗体发送消息】5-使用委托变量
            //相当于调用子窗体的PassMsg方法
            SendMsg(this.txtMainSendMsg.Text);
        }
        #endregion
        private void btClear_Click(object sender, EventArgs e)
        {
            this.txtMainRecieveMsg.Clear();
            this.txtMainSendMsg.Clear();
        }
        //创建集合存放子窗体
        private List<Form> list=new List<Form>();
        private void btCloseChild_Click(object sender, EventArgs e)
        {
            foreach (Form frm in list)
            {
                frm.Close();
            }
        }
    }
}