關於在Mdi模式中,子窗體相互拋轉資料是常見的作業方式,同時經查找資料,利用委派(delegate)的方式,可避免耦合等問題。範例的操作效果如上述視頻,其中a窗體為送出資料的子窗體,b窗體為接收資料的子窗體。另外,利用TextChanged事件,讓使用者不需要再點擊按鈕,即可同步接收資料。
在a窗體中的程式碼如下:
public partial class a : Form
{
public delegate void SendMsg(string msg);
public event SendMsg send;
public a()
{
InitializeComponent();
}
private void tb1_TextChanged(object sender, EventArgs e)
{
send(tb1.Text);
}
}
在b窗體中的程式碼如下:
public partial class b : Form
{
public b()
{
InitializeComponent();
a.SendMsg sendMsgDelegate = new a.SendMsg(ChangText);
a form1 = Application.OpenForms.OfType<a>().FirstOrDefault();
if (form1 != null)
{
form1.send += sendMsgDelegate;
}
}
private void b_Load(object sender, EventArgs e)
{
a form1 = new a();
form1.send += new a.SendMsg(ChangText);
}
private void ChangText(string msg)
{
tb2.Text = msg;
}
}
大致流程說明如下:
1.在a窗體中,定義了一個名為 send 的事件,其委託類型為SendMsg,該事件會在TextChanged時觸發,並傳遞 tb1.Text 的值作為參數。
2.在b窗體中的Load事件中,通過new實例化獲取到a,並註冊了a的send 事件處理方法,以接受tb1.Text 的值,並顯示在tb2中。
3.過程中遇到send未初始化的問題,用sendMsgDelegate和Application.OpenForms方法處理。
沒有留言:
張貼留言