C# 利用委托事件进行窗体间的传值(新手必看)
引言:
窗体间传值是每个学习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# 利用委托事件进行窗体间的传值(新手必看)的更多相关文章
- C# 利用委托事件进行窗体间的传值(简化)
定义委托 public delegate void SendMessageToChildForms(string s); //定义了一个参数是string ,无返回值的委托,名为 SendMessag ...
- winform利用委托delegate进行窗体间通信
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- winform利用委托delegate进行窗体间通信,相同标题已经存在??
前段时间学习委托,感觉很模糊的样子,也做过许多实例,但是项目中一直没有用到,今天在项目中遇到一个很简单的例子,现在拿出来,做一个简单的记录. 要求:将弹出框里勾选的内容返回到主面板上. 工具:委托. ...
- WPF 委托 事件 B窗体调用A窗体方法
原文:WPF 委托 事件 B窗体调用A窗体方法 具体实现 A窗体 中加载B窗体 B窗体触发A窗体里的方法 当点击B窗体确定Button事件 给A窗体俩个TextBox赋值 并关闭B窗体 B窗体 ...
- .NET开发之窗体间的传值转化操作
DOTNET开发之窗体间的传值转化操作 好想把自己最近学到的知识写下来和各位朋友分享,也希望得到大神的指点.今天终于知道自己要写点什么,就是关于WPF开发时简单的界面传值与简单操作. 涉及两个界面:一 ...
- C# WPF 通过委托实现多窗口间的传值
在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值. 在上代码之前呢,先简单介绍一下什么是C#中的委托(如果只想了解如 ...
- WinForm窗体间如何传值
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...
- WinForm窗体间如何传值的几种方法
(转) 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点: ...
- 2019-3-26WinForm窗体间如何传值的几种方法
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...
随机推荐
- sqlserver2008:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
在开始菜单中找到: 进入,点击左侧SQL Server服务, 将SQL Server(MSSQL.....)服务开启, 即可成功连接.
- jdk for centos7
https://www.cnblogs.com/chy123/p/6750351.html
- HanLP《自然语言处理入门》笔记--1.新手上路
1. 新手上路 自然语言处理(Natural Language Processing,NLP)是一门融合了计算机科学.人工智能及语言学的交叉学科,它们的关系如下图所示.这门学科研究的是如何通过机器学习 ...
- nmap详解之基础示例
扫描主机target.example.com的所有TCP端口 nmap -v target.example.com 发起对target.example.com所在网络上的所有255个IP地址的秘密SY ...
- oracle11G 已开启监听,但远程连接依旧无监听解决过程
1.连接数据库显示无监听程序,首先查看服务器的oracle监听服务是否开启,服务名称:OracleOraDb11g_home1TNSListener(具体环境中可能不完全一样,但是认准TNSListe ...
- YYC松鼠短视频系统上传视频会被压缩的问题如何解决?
uni.chooseVideo({ count: 1, compressed: false, sourceType: ['album', 'camera'], success: (res) => ...
- 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型
本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过 ...
- 分享数百个 HT 工业互联网 2D 3D 可视化应用案例之 2019 篇
继<分享数百个 HT 工业互联网 2D 3D 可视化应用案例>2018 篇,图扑软件定义 2018 为国内工业互联网可视化的元年后,2019 年里我们与各行业客户进行了更深度合作,拓展了H ...
- SpringBoot学习(2) - 自定义starter
自己开发一个spring boot starter的步骤1.新建一个项目(全部都基于maven),比如新建一个spring-boot-starter-redis的maven项目 pom.xml: &l ...
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...