winform独立窗体之间传值的简单方法

最近做一个多窗体联动的小程序,用到了窗体间传值。

网络上到处都是父窗体和子窗体之间传值的方法,总结起来有

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、事件驱动,重写自定义事件。

抛砖引玉,欢迎大家来讨论!

猜你喜欢

转载自www.cnblogs.com/nEoo/p/9286744.html