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

2、子窗体A部分代码

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

3、子窗体B的部分代码

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

    在python的数据类型中,整数.字符串.元组是不可变的:而列表.字典是可变的.所以不用C的思维来修改一个整数,它相当于重新定义了一个整数(原来的被覆盖掉了),名字和原来一样,但与前面的同名变量没有一 ...

  2. tencent intern learning

    gslb全局负载均衡   (负载均衡的问题就是某些session保存在某台服务器中,这个用户就只能用那台服务器服务了) jwt vs 传统cookies & session  (jwt类似于公 ...

  3. my___sublime Text配置

    sublime text 备份 插件下载 http://www.cnblogs.com/457220157-FTD/p/5546545.html https://www.jianshu.com/p/3 ...

  4. bootstrap3-dialog:更强大、更灵活的模态框(封装好的模态框)

    用过bootstrap框架的同学们都知道,bootstrap自带的模态框用起来很不灵活,可谓鸡肋的很.但nakupanda开源作者封装了一个更强大.更灵活的模态框——bootstrap3-dialog ...

  5. (转)Nagios 配置及监控

    Nagios 配置及监控 原文:http://blog.csdn.net/linuxlsq/article/details/52606824 Nagios 监控 在互联网日益发展的今天,监控的重要性已 ...

  6. 怎么调取dede三级栏目名及栏目下的内容列表

    网站根据需要,把地区划成省-市-文章的层级结构,栏目首页需要显示的是 {dede:channelarclist} <!--省显示--> <a href=""> ...

  7. Andrew Ng 的 Machine Learning 课程学习 (week5) Neural Network Learning

    这学期一直在跟进 Coursera上的 Machina Learning 公开课, 老师Andrew Ng是coursera的创始人之一,Machine Learning方面的大牛.这门课程对想要了解 ...

  8. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  9. Devexpress Xtrareports 创建多栏报表

    根据官方回答:多列或多行(取决于当前的多栏设置)呈现数据的报表 这种报表是有用的,例如,当每个明细区都只显示少量数据.并且需要在一列的右侧打印下一个明细区时,这样就能充分利用整个页面的宽度,此外,当创 ...

  10. 什么是MongoDb

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mo ...