标签:通信 多用户 void ext 总结 绑定 注册 btn rgs
最近做一个多窗体联动的小程序,用到了窗体间传值。
网络上到处都是父窗体和子窗体之间传值的方法,总结起来有
1、有参数的构造函数,
2、委托
以委托为例,父窗体如果想要发送信息给子窗体,只需要在父窗体中定义好事件。
//str为发送内容,formName为指定要发送给的窗体名字 public delegate void ReceiveMsg(string str,string formName); public event ReceiveMsg receiveMsg;
然后在实例化子窗体时,将子窗体内接受消息的函数绑定至该事件即可
frm4 f = new frm4(); this.receiveMsg += f.GetMsg; f.Show();
需要发送消息时,执行事件的invoke函数即可。
//发送给办公室 private void BangongshiBtn_Click(object sender, EventArgs e) { receiveMsg.Invoke("\n来自学生论坛的消息!!!\n" + this.comboBox1.Text, "frm4"); }
同样道理,子窗体如果要向父窗体发送消息,就需要在子窗体内定义事件,然后由父窗体注册。需要发送消息时在子窗体内执行Invoke函数即可。
不难看出,上述过程依赖于子窗体的实例化阶段。
现在出现这种情况,由父窗体(“学生论坛”)分别建立两个子窗体“办公室”、“图书馆”。
这两个子窗体互相之间没有所谓“父子”关系,那么如何互相通信呢?
下面提供一种简单的方法,通过将控件(也可以扩展至其他数据结构)装入属性中的方式来实现效果。
在其中一个子窗体内,公开控件的赋值方法
private string str; public string Str { get { return str; } set { str = value; this.richTextBox1.AppendText(str); } }
然后在另外一个子窗体内,发送消息的button_click事件中,遍历当前所有父窗体的子窗体,并找到自己要发送消息的那个窗体,通过赋值给Str的方式,实现独立窗体之间传值。
//发送给办公室 private void button2_Click(object sender, EventArgs e) { foreach (Form item in Application.OpenForms) { if (item.Name == "frm4") { ((frm4)item).Str = "\n来自图书馆的消息:\n" + this.comboBox1.Text + "\n"; } } }
最后实现效果如下:
这里只是提供一种简单的独立窗体之间的传值方法。当然还有其他方法,例如遇到类似多用户聊天的时候,就不能采用这种方法。
可以采用诸如:
1、公共数据类,定时器查询刷新;
2、事件驱动,重写自定义事件。
抛砖引玉,欢迎大家来讨论!
标签:通信 多用户 void ext 总结 绑定 注册 btn rgs
原文地址:https://www.cnblogs.com/nEoo/p/9286744.html