C# 多窗口委托通信
叶子丶de花 人气:0窗口之间通信无非有两个方向,主窗口发送数据到副窗口,副窗口发送数据到主窗口。
代码在最下面,先看一下解决的思路。
首先是简单的主窗口传数据到副窗口。
在副窗口创建一个函数,必须是public修饰的!!!,入口参数可以任意设置。
然后主窗体创建副窗体,直接调用副窗口函数即可实现数据传输。
蓝框就是创建的窗口句柄的,等于已经创建了一个新窗口(我个人是喜欢全局创建窗口,在后面可以直接判断IsHandleCreated就可以知道窗口是否已经被打开了,没打开就再实例化一个,如果已经创建,在红框中判断是否最小化,然后正常显示窗口并置顶。)。
黄框就是显示这个窗口第二行就是添加委托任务的,但是现在还不需要,所以这句可以暂时忽略,后面会说。第三句就是将数据同步到副窗口,然后下一句显示窗口。
然后是副窗口传数据到主窗口。
需要使用委托。上述的主窗口到副窗口也可以用委托。
需要现在副窗口内创建委托事件。箭头所指的部分可以自定义名称,入口参数也可以自定义。
第一行先创建,第二行对应到具体使用的函数名称。
然后直接使用F_MoreSend_SyncData_To_Main(); 加参数即可传数据到主窗口。
调用以下函数发送数据到主窗口。
这只是副窗口的设置,还需要设置主窗口程序。
主窗体需要创建一个名称不同的但是参数和参数名称都一样的函数,此函数会映射到副窗口中的发送函数。副窗口发来的数据会在此函数内处理。
此外主窗体显示副窗口之前还需要将上述的两个映射函数对应起来。
完整代码
副窗口:
//*创建委托任务 public delegate void Form_MoreSend_SyncData_To_Form_Main(byte flag, byte count, string data); public event Form_MoreSend_SyncData_To_Form_Main F_MoreSend_SyncData_To_Main; //*发送数据 F_MoreSend_SyncData_To_Main(0, 0, "01 23 45 67 89"); //*同步主窗口数据 public void F_MoreSend_SyncData_From_From_Main(byte flag, byte count, string data) { }
主窗体:
//*处理副窗口数据 public void Form_SyncData_From_MoreSend(byte flag, byte count, string data) { } //*创建窗口 Form_MoreSend F_MoreSend = new Form_MoreSend(); //*按键打开窗口 private void Button_MoreSendData_Click(object sender, EventArgs e) { if (!F_MoreSend.IsHandleCreated) //*未打开则打开 { F_MoreSend = new Form_MoreSend(); //*建立映射关系,接收副窗口数据 F_MoreSend.F_MoreSend_SyncData_To_Main += Form_SyncData_From_MoreSend; //*发送数据到副窗口 F_MoreSend.F_MoreSend_SyncData_From_From_Main(0, 0, ""); F_MoreSend.Show(); } else if (F_MoreSend.IsHandleCreated) //*已打开则显示 { if (F_MoreSend.WindowState == FormWindowState.Minimized) { F_MoreSend.WindowState = FormWindowState.Normal; } //F_MoreSend.Focus(); F_MoreSend.TopMost = true; F_MoreSend.TopMost = false; } }
加载全部内容