引言:

  窗体间传值是每个学习WinForm新手的常见问题,最初级的方法就是 在窗体中先获取到要接受值窗体。然后通过.得到某个空间或者属性,直接赋值,这个需要接收放的窗体属性或者空间必须是public ,是极不安全的一种方式。在升级一下的新手做法就是在接受窗体中定义一个方法然后通过 调用这个方法来给某个控件或者属性赋值。这两种方法都是非安全的低级方式。非常不建议使用。本文我们讲讲如何通过委托事件(非单纯的委托)来解决窗体间信息传递的问题。

场景:

通过点击主主窗体From_Main的发送按钮,所有子窗体中显示出发送的内容,如下图

学习前提:

对委托有初步了解。如果你对委托一点不了解,建议先看一下本人前一篇关于委托的基础介绍文章。

正文:

第1步:定一个委托 

代码:

      public delegate void SendMessageToChildForms(string s); //定义了一个参数是string ,无返回值的委托,名为SendMessageToChildForms。

说明:1.他可以定义在项目中任何可以被访问到的地方(如主窗体,某一个子窗体,或者一个类) 。但原则上定义在一直存在的窗体中,本例在主窗体中的命名空间标题下。

2.系统内置了两个定义好的委托类型 Action 和Func ,你也可以直接省略这一步。在第3步实例化他就可以了。其中Action是无返回值的委托,Func是带返回值的委托。他们的输入参个数数都是0~16个。

第2步:实例化一个此委托类型的事件

代码:

    public event SendMessageToChildForms smtcf_event;

说明:1.可以省略event ,public有时也不写,就可以简写成 SendMessageToChildForms smtcf;不利于新手理解,其实他本质就是实例化了一个事件event

   2.如果我们使用了微软内置的委托类型Action或者Func 则可以写成这样 public event Action<string> SendMessageToChildForms;  这里string 必须要写,因为没有第1步所以这里需要指明参数列表。

3.委托与委托事件的关系,本例中使用了委托事件 ,相对于委托更安全。更低耦合。委托是一个类型,例如SendMessageToChildForms类,事件是委托类型的一个实例 如smtcf_event。

第3步:定义具体执行的方法 

代码:

public void ToShowGetMessage(string s)
{
     this.lb_收到内容.Text=s;
}

说明:1.具体的功能方法,这里那个窗体需要执行就写在哪个窗体里,比如本例是更新子窗体的显示,所以写到子窗体里,如果换成另一场景:子窗体中删除了当前这条信息,需要更新,那么就定义到主窗体中

2.方法的参数列表及返回类型必须与委托完全一致。比如本例,参数列表是一个string消息字符串,返回类型是void空,方法必须是public;

第4步:方法绑定到委托上

代码: 

Form_Child frm_child = new Form_Child();
smtcf_event+= new SendMessageToChildForms(frm_child.ToShowGetMessage); //在一实例化的一个委托事件上绑定子窗体的具体方法
frm_child.Show();

Form_Child frm_child2 = new Form_Child();
smtcf_event+= new SendMessageToChildForms(frm_child2.ToShowGetMessage); //在一实例化的一个委托事件上绑定子窗体的具体方法
frm_child2.Show();

注意:1.把要执行的方法在新窗体初始化时绑定到他里面定义好的委托类型事件上,必须要在子窗体Show()时间之前

2.一个委托事件smtcf 可以绑定多个方法。

第5步:触发委托

代码:

//委托第5步:触发委托
if (smtcf_event!= null) //判断委托事件是否为空,如果委托不为空才执行
{
smtcf_event.Invoke(this.textBox1.Text.Trim());// 可以省略Invoke 简写为smtcf(this.textBox1.Text.Trim());
}

说明:1.必须首先判断一下委托事件smtcf是否为空。再执行;

      2.一般 简写为smtcf_event(this.textBox1.Text.Trim());

3.网上有人说委托事件smtcf_event不能直接调用Invoke()方法。本例中测试可以,有知道原因的这里请教一下各位。

C# 利用委托事件进行窗体间的传值相关推荐

  1. C#利用委托事件解决银行还款问题

    文章目录 详细问题 一.代码内容 总结 详细问题 用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可选择某张储蓄卡进行还款: ...

  2. WinForm窗体间如何传值

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...

  3. 利用事件进行窗体间传值

    为什么80%的码农都做不了架构师?>>>    举例,现在有两个窗体,SelectForm窗体查询信息集合,使用DataGridview显示信息集合,EditForm窗体添加和修改信 ...

  4. 转:c#委托事件实现窗体传值通信

    C#实现Winform窗口间数据交互的三种方法介绍 2010-03-15  来自:CNBLOG  字体大小:[大 中 小] 摘要:本文分别介绍C#实现Winform窗口间数据交互的三种方法:修改子窗体 ...

  5. 转:c#委托事件实现窗体传值

    效果图下如下:开始启动的是窗口1,打开窗口2后,在窗口1中textBox1开始输入,窗1中的内容同时显示在窗2 textBox1中. 要想在窗口2中显示窗1的信息,首先,要建立一个刷新窗2中textB ...

  6. 委托事件实现更新窗体

    委托 和 事件在 .Net Framework中的应用非常广泛. 委托( Delegate ):是一种定义方法签名(只有方法的名字,没有方法体),可以与具有兼容的签名的任何方法关联.所谓兼容的方法,是 ...

  7. C#的委托事件在winform窗体中实现传值备忘

    用一个例子来说明吧,这样比较好明白一些. 就是打开主窗体,datagridview加载了一些数据,然后我们在打开的子窗体中,输入一些条件,让主窗体中的数据随着加载的条件来动态实现加载数据. 这就需要涉 ...

  8. C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值

    用户控件主窗体结构:左侧树形菜单,右侧Panl: 根据点击的菜单节点,panl里面选择性加载某一个子窗体用户控件,并传值给子窗体: 反之,在子窗体进行相应的操作之后,传值给主窗体,触发主窗体的刷新. ...

  9. 利用委托 实现窗体间通信,非原创

    copy自:https://www.cnblogs.com/hugoNB/p/7130562.html,这个作者写的浅显易懂,就复制下来自己看 实现过程: 这里主要是用到委托实现,所以主要描述一下委托 ...

最新文章

  1. 人工智能项目:需要注意的七件事
  2. 想学python从哪里入手-零基础学习python?要从哪里开始入手呢?
  3. OC中protocol、category和继承的区别
  4. VC++实现任务管理器功能
  5. mysql segmentation fault_mysql Segmentation fault的问题,求教
  6. 懒加载 jquery代码
  7. 如何自己编写Makefile
  8. Linux 命令之 pwunconv -- 关闭投影密码
  9. php关联数组和哈希表,php遍历哈希表及关联数组的实例代码
  10. React开发(113):git 操作记录
  11. mysql 生成xml 表头_Spring Boot + MySql + Mybatis generator 自动生成mapper/entity/xml文件
  12. OpenCV中的reshape
  13. 计算机视觉基本研究方向
  14. 烽火fr2600怎么web登录_烽火R2600路由器配置步骤及脚本文件
  15. 计算机自动关机启机唤醒设置,电脑设置自动关机和自动开机
  16. CorelDRAW 12快捷键
  17. 我认为到现在写的最好的一本小说 《紫川》
  18. 【沃顿商学院学习笔记】领导力——Business Impact:09 逻辑模型四 Logic Model4
  19. python for 无限循环
  20. js 将一大段时间均分为很多个小时间段

热门文章

  1. 数据挖掘与数据分析的主要区别
  2. java 的long型整数的最大值
  3. C语言中的int8_t,uint8_t, int16_t,uint16_t, int32_t,uint32_t, int64_t,uint64_t和int数组,char数组以及sizeof()的理解
  4. ITSS项目经理项目经理 信息技术应用创新领域-信创运维 介绍
  5. [附源码]计算机毕业设计Q宝商城Springboot程序
  6. linux命令2个杠是什么意思,shell脚本使用两个横杠接收外部参数的方法
  7. 公司技术大咖分享会--后记
  8. 跨端开发如何实现降本增效?
  9. 建立新工作簿就是建立新的计算机磁盘文件,新大学计算机基础选择题题库19.xls...
  10. 手写体识别python,python使用KNN算法手写体识别