【摘自:http://www.cnblogs.com/codeToUp/p/5371062.html

工程的源代码地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git

C#winform窗体间传值,三种方法示例,注释详细。使用方法:使用vs2013打开编译运行即可;

工程中总共介绍了三种方法:
###方法1:通过保存对象的引用调用其方法实现对子窗体的控制;
###方法2:通过委托,在子窗体显示之前,为委托赋值,关注主窗体的数据变化,当有当有多个窗体需要接收信息,只需要为委托继续赋值(+=)即可,实现了数据传递的解耦性;
###方法3:子窗体弹出来之前,注册事件,关注主窗体消息的变化,当有多个窗体需要接收信息,,只需要分别为窗体注册数据接收事件即可,实现了数据传递的解耦性;

方法2与方法3即为发布订阅模式(观察者模式)

演示窗体的界面如下:

在MainForm中打开A、B窗体,在MainForm中输入文本数据,点击发送消息,A、B的文本框会显示对应的数据;


主窗体为消息的发布者,窗体A、B等等为消息的接收者;

部分代码如下(全部源代码参考上述链接):

1、主窗体的部分代码:

  1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WinFrmDemo
12 {
13
14
15 public partial class MainForm : Form
16 {
17 #region 方法1(不推荐)--通过保存对象的引用调用的对象的公有方法实现窗体的传值
18 //当接收数据的窗体增加,需要修改发送消息的代码,并且增加相应数量的窗体引用 可扩展性差,耦合性较高
19 //public ObeserverFormA ChildFormA { get; set; }
20 //public ObeserverFormB ChildFormB { get; set; }
21 #endregion
22
23 #region 方法2---委托方式传值
24 //定义发布消息的委托 委托是一个类型 委托可以在外部获得执行
25 public Action<string> SendMsg { get; set; }
26 #endregion
27
28 #region 方法3(推荐)--事件方式
29 //增加event关键字
30 //定 义消息发布的事件 事件是委托的一个特殊实例 事件只能在类的内部触发执行
31 public event EventHandler SendMsgEvent; //使用默认的事件处理委托
32 #endregion
33
34
35
36 public MainForm()
37 {
38 InitializeComponent();
39 }
40
41 private void ParentFrm_Load(object sender, EventArgs e)
42 {
43
44 #region 方法1(不推荐)
45 //ObeserverFormA childFormA = new ObeserverFormA();
46 //ChildFormA = childFormA;
47 //childFormA.Show();
48 //ObeserverFormB childFormB = new ObeserverFormB();
49 //ChildFormB = childFormB;
50 //childFormB.Show();
51 #endregion
52
53 #region 方法2---委托方式传值
54 //子窗体弹出来之前,为委托赋值,关注主窗体消息的变化,当有多个窗体需要接收信息,只需要在此修改即可
55 //ObeserverFormA childFormA = new ObeserverFormA();
56 //SendMsg += childFormA.SetText;//委托赋值
57 //childFormA.Show();
58 //ObeserverFormB childFormB = new ObeserverFormB();
59 //SendMsg += childFormB.SetText;
60 //childFormB.Show();
61 #endregion
62
63
64 #region 方法3(推荐)--事件方式
65 //子窗体弹出来之前,注册事件,关注主窗体消息的变化,当有多个窗体需要接收信息,只需要在此修改即可
66 ObeserverFormA childFormA = new ObeserverFormA();
67 SendMsgEvent += childFormA.MainFormTxtChaned;//为子窗体注册事件,在子窗体中事件处理代码中设置文本
68 childFormA.Show();
69 ObeserverFormB childFormB = new ObeserverFormB();
70 SendMsgEvent += childFormB.MainFormTxtChaned;
71 childFormB.Show();
72 #endregion
73
74
75
76 }
77
78 //当MainForm中输入文本,点击发送消息,子窗体的文本框显示主窗体的数据
79 private void btnSendMsg_Click(object sender, EventArgs e)
80 {
81 #region 方法1(不推荐)
82
83 //ChildFormA.SetText(this.txtMsg.Text);
84 //ChildFormB.SetText(this.txtMsg.Text);
85
86 #endregion
87
88 #region 方法2---委托方式传值
89 //if (SendMsg!=null)
90 //{
91 // SendMsg(this.txtMsg.Text);//执行所有注册的委托
92 //}
93
94 #endregion
95
96 #region 方法3(推荐)--事件方式
97 //触发事件
98 //EventArgs,写一个子类继承该类,子类中添加需要封装的数据信息,此处只需要传递string信息,详见MyEventArgs
99 SendMsgEvent(this,new MyEventArg(){Text=this.txtMsg.Text});
100 #endregion
101 }
102 }
103 }

2、子窗体A部分代码

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WinFrmDemo
12 {
13 public partial class ObeserverFormA : Form
14 {
15 /// <summary>
16 /// 提供外部访问自己元素的方法
17 /// </summary>
18 /// <param name="txt"></param>
19 public void SetText(string txt)
20 {
21 this.txtMsg.Text = txt;
22 }
23 public ObeserverFormA()
24 {
25 InitializeComponent();
26 }
27
28 public void AfterParentFrmTextChange(object sender, EventArgs e)
29 {
30 //拿到父窗体的传来的文本
31 MyEventArg arg = e as MyEventArg;
32 this.SetText(arg.Text);
33 }
34
35 internal void MainFormTxtChaned(object sender, EventArgs e)
36 {
37 //取到主窗体的传来的文本
38 MyEventArg arg = e as MyEventArg;
39 this.SetText(arg.Text);
40
41 }
42 }
43 }

3、子窗体B的部分代码

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10
11 namespace WinFrmDemo
12 {
13 public partial class ObeserverFormB : Form
14 {
15
16 public ObeserverFormB()
17 {
18 InitializeComponent();
19 }
20
21 /// <summary>
22 /// 提供外部访问自己元素的方法
23 /// </summary>
24 /// <param name="txt"></param>
25 public void SetText(string txt)
26 {
27 this.txtMsg.Text = txt;
28 }
29
30 internal void MainFormTxtChaned(object sender, EventArgs e)
31 {
32 //取到主窗体的传来的文本
33 MyEventArg arg = e as MyEventArg;
34 this.SetText(arg.Text);
35 }
36 }
37 }
 
 

public class MyEventArg :EventArgs
{
  //传递主窗体的数据信息
  public string Text { get; set; }
}

C#使用事件方式Winform窗体之间传值的更多相关文章

  1. 观察者模式的应用:Winform窗体之间传值

    观察者模式的应用:Winform窗体传值 观察者模式的概念: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并更新. 今天我们就学着用一下这个观察者模式,先想象 ...

  2. WinForm窗体之间传值

    当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包 ...

  3. C# Winform窗口之间传值的多种方法浅析(转)

    摘要http://www.jb51.net/article/63837.htm 这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值.通过属性传递.通过事件携带 ...

  4. c# winform 窗体之间的传参

    说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...

  5. C# winform窗体间传值(使用委托或事件)

    窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...

  6. winform 窗体间传值

    WinForm 两窗体之间传值实例 2010-12-27 22:10:11|  分类: 学业|举报|字号 订阅     下载LOFTER我的照片书  |     窗体Form1和Form2 Form2 ...

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

    windows form (窗体) 之间传值小结   windows form (窗体) 之间传值小结 在windows form之间传值,我总结了有四个方法:全局变量.属性.窗体构造函数和deleg ...

  8. c# 日常记录,(获取系统时间、return),一些文件隐藏无法引用,c#多个窗体之间传值

    1.获取系统时间 DateTime.Now.ToString(); DateTime dt =DateTime.Now; dt.AddDays(1); //增加一天 dt.AddDays(-1);// ...

  9. winform窗体 小程序【打开多个窗体、窗体之间传值、打开唯一窗体】

    1.打开多个窗体 2.窗体之间的传值 3打开唯一窗体

随机推荐

  1. tcp 粘包 和 TCP_NODELAY 学习

    TCP通信粘包问题分析和解决  在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为 ...

  2. Python镜像源

    镜像源 官方:https://pypi.python.org/pypi 豆瓣:https://pypi.doubanio.com/simple/ 阿里:http://mirrors.aliyun.co ...

  3. sqoop导出数据

    export是HDFS里的文件导出到RDBMS的工具,不能从hive.hbase导出数据,且HDFS文件只能是文本格式.如果要把hive表数据导出到RDBMS,可以先把hive表通过查询写入到一个临时 ...

  4. Mac 终端执行sql命令

    https://www.cnblogs.com/sbj-dawn/p/6905930.html. 远程登录MYSQL数据库 > mysql -u username -p -h hostname ...

  5. C# String.Join用法

    String.Join(String, String[]) 在指定 String 数组的每个元素之间串联指定的分隔符 String,从而产生单个串联的字符串 例如: string [] array={ ...

  6. Unity 组件.name

    组件.name  指的是组件所在游戏对象的名字,例如: Animation m_animation; m_animation =GetComponent<Animation>(); m_a ...

  7. 性能测试工具Jmeter04-脚本录制

    Jmeter脚本录制:不推荐使用,这里就不介绍了 Badboy脚本录制 下载地址:http://www.badboy.com.au Badboy是一个强大的工具,旨在帮助测试和开发复杂的动态应用.Ba ...

  8. 使用CSS选择器进行元素定位

    在selenium webdriver中,支持使用CSS选择器来进行元素定位,事实在真的投入工作,大量编辑用例和元素定位的时候,使用css 和 xpath才是经常需要用到的. 之前有专门讲过使用xpa ...

  9. JQuery 的跨域方法 可跨任意网站

    JS的跨域问题,很多人在网上找其解决方法,教其用IFRAME去解决的文章很多,真有那么复杂吗?其实很简单的,如果你用JQUERY,一个GETJSON方法就搞定了,而且是一行代码搞定. 下面开始贴出方法 ...

  10. C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题

    不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有 ...