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

【摘自: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; }
}

时间: 2024-10-11 13:19:15

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

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

最近做一个多窗体联动的小程序,用到了窗体间传值. 网络上到处都是父窗体和子窗体之间传值的方法,总结起来有 1.有参数的构造函数, 2.委托 以委托为例,父窗体如果想要发送信息给子窗体,只需要在父窗体中定义好事件. //str为发送内容,formName为指定要发送给的窗体名字 public delegate void ReceiveMsg(string str,string formName); public event ReceiveMsg receiveMsg; 然后在实例化子窗体时,将子窗

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

窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git C#winform窗体间传值,三种方法示例,注释详细.使用方法:使用vs2013打开编译运行即可: 工程中总共介绍了三种方法:###方法1:通过保存对象的引用调用

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()             {       

c# winform 窗体之间的传参

说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖小屋的c# winform窗体之间传递参数问题总结,大家可以看看他的这篇博客学习学习. 下面我要给大家说的一种方法相对来说有点繁琐,但对于winform程序初学者来说绝对的受用.之前在度娘上寻找winform窗体的显示与隐藏受到点启发,本来winform程序创建新的窗体的时候是不带参数的,为了能够在

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

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

winform 窗体之间的操作

1 通过一个窗体按钮打开另一个窗体 Form f2 = new Form2(); f2.Show(); 通过这个打开第二个页面  要想只显示一个页面只能隐藏第一个页面 如果第一个页面关闭 第二个页面也会跟着关闭.. 2窗体之间的传值 窗体之间传值 需要两个甚至多个窗体 Form f2 = new Form2(要传递的值);f2.Show(); 然后再另一个需要这个值的窗体中 Users z = null;//根据值的类型实例化public Form4(Users a) //方法这里也要写要传入的

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

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

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

窗体之间传值的方法

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