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();
}
}
}
}