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

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

原文地址:https://www.cnblogs.com/nEoo/p/9286744.html

时间: 2024-12-12 20:15:35

winform独立窗体之间传值的简单方法的相关文章

一个简易的便签工具:探索窗体之间传值和传引用的方法

简单的便签工具:实现了基于文本的便签信息的浏览,删除,添加.可以查看时间,实时更新数据. 这个便签工具完全基于面向对象的编程方式,首先定义Note类,然后使用NoteManager类进行便签的管理.其中的关键就是在NoteManager类中定义list<Note>泛型集合.原理上和ArrayList基本是一致的. NoteManager的工作原理: public List<Note> list;//定义一个泛型集合,并在构造函数中初始化. private int CurrentIn

windows form (窗体) 之间传值小结

windows form (窗体) 之间传值小结 在windows form之间传值,我总结了有四个方法:全局变量.属性.窗体构造函数和delegate. 第一个全局变量: 这个最简单,只要把变量描述成static就可以了,在form2中直接引用form1的变量,代码如下: 在form1中定义一个static变量public static int i= 9 ; Form2中的钮扣按钮如下: private void button1_Click(object sender, System.Even

C#使用事件方式Winform窗体之间传值

[摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git C#winform窗体间传值,三种方法示例,注释详细.使用方法:使用vs2013打开编译运行即可: 工程中总共介绍了三种方法:###方法1:通过保存对象的引用调用其方法实现对子窗体的控制:###方法2:通过委托,在子窗体显示之前,为委托赋值,关

winform多窗体之间的操作

1.通过操作一个窗体打开另一个窗体 已有窗体为Form1.Form1中有一个按钮,对该按钮编写点击事件: Form2 f2 = new Form2();f2.Show(); 通过这段代码来打开Form2. 在实际应用中会出现代开Form2后需要Form1隐藏的情况,此时可以加入代码:this.Hide();来实现隐藏Form1. [不能关闭Form1,如果关闭Form1,那么Form2也会关闭,因为Form1是主窗体] 2.在窗体之间进行值的传递 在某些情况下,需要用到某个已经获取到的值,为了提

窗体之间传值的方法

第一种方法: 创建一个类,里面声明用于存储接收的字段.传的时候存储于字段中,要用的时候,直接类名.字段名 进行调用.(这种方法传递是双向的) 第二种方法: 1.在Form1里定义 public string Name = "*****" 2. 在Form2里创建Form1对象, Form1 f = new Form1(); 然后就可以通过f.Name取值了 第三种方法:用构造函数在窗体Form2中 int value1; string value2; public Form2 ( in

winform使用委托和事件在窗体之间传值

定义委托和事件,并且触发这个事件 //定义委托 public delegate void ShowOutStockDelegate(List<OutStockResultDto> outStockResultDto); //定义事件 public event ShowOutStockDelegate ShowOutStockEvent; private void btnConfirm_Click(object sender, EventArgs e) { ShowOutStockEvent(o

窗体之间传值

传值可在副窗口cs中定义副窗口的Tag属性,结合主窗口cs中的:副窗口类名.ActiveForm.Tag属性//进行传递. 同时须结合主窗口中定义的副窗口的FormClosing方法. private void 显示标注ToolStripMenuItem_Click(object sender, EventArgs e) { //没有图层时,报提示框 if (axMapControl1.LayerCount <= 0) { MessageBox.Show("当前无图层,无法显示标注&quo

c# 不同窗体之间传值和调用

1.子窗体事件刷新父窗体界面值 子窗体定义委托和事件 //声明一个委托 public delegate void DisplayUpdateDelegate(string str); //声明事件 public event DisplayUpdateDelegate ShowUpdate; private void Form2_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventA

winform 窗体间传值

WinForm 两窗体之间传值实例 2010-12-27 22:10:11|  分类: 学业|举报|字号 订阅 下载LOFTER我的照片书  | 窗体Form1和Form2 Form2由Form1打开(1.模式窗体 2.非模式) Form2的TextBox值传回Form1的TextBox中 Form1:       public partial class Form1 : Form         {             public Form1()             {