C#窗体传值代码方法
作者:.NET开发菜鸟 发布时间:2022-12-03 22:57:37
标签:C#,窗体传值
一、前言
我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值。假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现。
二、公共属性
我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面给公共属性赋值,这样可以实现窗体之间传值,子窗体代码如下:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmChild : Form
{
public frmChild()
{
InitializeComponent();
}
// 定义一个公共属性,接收传递的值
public string strMessage { get; set; }
/// <summary>
/// 窗体加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmChild_Load(object sender, EventArgs e)
{
// 将接收到的值显示在窗体上
this.lblMessage.Text = strMessage;
}
}
}
父窗体代码:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmParent : Form
{
public frmParent()
{
InitializeComponent();
}
/// <summary>
/// 单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Value_Click(object sender, EventArgs e)
{
frmChild child = new frmChild();
// 给窗体的公共属性赋值
child.strMessage = this.txtMessage.Text.Trim();
// 显示子窗体
child.Show();
}
}
}
这种方式有一个缺点:属性需要设置为public,不安全。
二、公共方法
我们还可以在子窗体里面定义一个方法,通过调用方法传值,子窗体代码如下:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmChild : Form
{
public frmChild()
{
InitializeComponent();
}
// 定义一个公共属性,接收传递的值
//public string strMessage { get; set; }
// 定义属性为private
private string strMessage { get; set; }
/// <summary>
/// 给私有属性赋值
/// </summary>
/// <param name="strText"></param>
public void SetText(string strText)
{
strMessage = strText;
}
/// <summary>
/// 窗体加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmChild_Load(object sender, EventArgs e)
{
// 将接收到的值显示在窗体上
this.lblMessage.Text = strMessage;
}
}
}
父窗体代码:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmParent : Form
{
public frmParent()
{
InitializeComponent();
}
/// <summary>
/// 单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Value_Click(object sender, EventArgs e)
{
#region 调用公共属性赋值
//frmChild child = new frmChild();
//// 给窗体的公共属性赋值
//child.strMessage = this.txtMessage.Text.Trim();
//// 显示子窗体
//child.Show();
#endregion
#region 调用方法赋值
frmChild child = new frmChild();
// 给窗体的公共属性赋值
child.SetText(this.txtMessage.Text.Trim());
// 显示子窗体
child.Show();
#endregion
}
}
}
这种方式同样也有缺点:属性虽然是private的了,但是方法还是public的。
三、委托
上述两种方式都是不安全,下面我们使用委托来实现窗体之间传值。
1、定义一个委托
我们在主窗体里面定义一个有参无返回值的委托:
// 定义一个有参无返回值的委托
private delegate void SendMessage(string strMessage);
2、实例化一个此委托类型的事件
在父窗体里面定义一个委托类型的事件:
// 定义一个委托类型的事件
public event SendMessage sendMessageEvent;
委托与事件的关系,事件相对于委托更安全,更低耦合。委托是一个类型,事件是委托类型的一个实例。
3、定义要执行的方法
这里其实就是在子窗体里面定义一个给控件赋值的方法:
/// <summary>
/// 给控件赋值的方法
/// </summary>
/// <param name="strValue"></param>
public void SetValue(string strValue)
{
this.lblMessage.Text = strValue;
}
4、将方法绑定到事件
frmChild child = new frmChild();
// 将方法绑定到事件上
sendMessageEvent += new SendMessage(child.SetValue);
// 也可以使用下面的简写形式
// sendMessageEvent += child.SetValue;
child.Show();
5、触发委托
在按钮的点击事件里面触发委托:
if(sendMessageEvent!=null)
{
sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
}
上面的代码中使用的是自定义的委托,我们也可以使用.Net 框架里面自带的Action泛型委托:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmParent : Form
{
// 定义一个有参无返回值的委托
public delegate void SendMessage(string strMessage);
// 定义一个委托类型的事件
public event SendMessage sendMessageEvent;
public event Action<string> actionEvent;
public frmParent()
{
InitializeComponent();
}
/// <summary>
/// 单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Value_Click(object sender, EventArgs e)
{
#region 调用公共属性赋值
//frmChild child = new frmChild();
//// 给窗体的公共属性赋值
//child.strMessage = this.txtMessage.Text.Trim();
//// 显示子窗体
//child.Show();
#endregion
#region 调用方法赋值
//frmChild child = new frmChild();
//// 给窗体的公共属性赋值
//child.SetText(this.txtMessage.Text.Trim());
//// 显示子窗体
//child.Show();
#endregion
#region 通过委托传值
//frmChild child = new frmChild();
//// 将方法绑定到事件上
//// sendMessageEvent += new SendMessage(child.SetValue);
//// 也可以使用下面的简写形式
//sendMessageEvent += child.SetValue;
//child.Show();
#endregion
#region 使用Action
frmChild child = new frmChild();
// 将方法绑定到事件上
actionEvent += child.SetValue;
child.Show();
#endregion
// 使用自定义委托
//if (sendMessageEvent!=null)
//{
// sendMessageEvent.Invoke(this.txtMessage.Text.Trim());
//}
// 使用Action委托
if (actionEvent != null)
{
actionEvent.Invoke(this.txtMessage.Text.Trim());
}
}
}
}
来源:https://www.cnblogs.com/dotnet261010/p/12301683.html
0
投稿
猜你喜欢
- 泛型是Java中一个非常重要的内容,对于Java进阶学习是必须要掌握的知识点之所以说这个知识点重要,如果你有过阅读过一些开源框架的代码,那你
- 前言惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。首先,您可以
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- ArrayList中存放引用数据类型ArrayList中存放引用类型时,存放的是一个引用,因此在放入ArrayList之后再进行改动会影响到
- 目标&背景我们以“处理订单数据”为例,假设我们的应用是一个分布式应用,有"订单应用","物流应用&qu
- 简介java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢?我们看一个peek的例子:Stream&l
- 从java14开始, switch语句有了一个很大的调整, 这就让swicth语句有了更多的操作和选择,在代码上,更加的简便灵活.switc
- 1.CAS1)CAS概念CAS时Compare And Swap缩写,即比较与交换是用于实现多线程同步的原子指令,它将内存位置的内容与给定值
- 本文实例讲述了linux环境下java程序打包成简单的hello world输出jar包。分享给大家供大家参考,具体如下:1. linux必
- 最近有小伙伴问我,双枚举类该怎么写,还得包括根据key取值方法。于是就手写一个案例如下:/** * 关系类型枚举 */public enum
- 一、链表1.1 概述链表是真正动态的数据结构,最简单的动态数据结构,基本用于辅助组成其他数据结构。数据存储在“节点”(Node)中优点:真正
- 最终效果如下大概就几个步骤1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4.项目准备 5.编写 Dock
- 本文实例讲述了C#获取指定年份第一个星期一具体日期的方法。分享给大家供大家参考。具体如下:DateTime day = DateTime.P
- 本文实例讲述了C#串口通信实现方法。分享给大家供大家参考。具体方法如下:通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数
- Java提示缺少返回值语句怎么办?这里我们给大家提供具体的解决方法。首先,以下面的程序为例,会看到在控制台有:错误:缺少返回语句的提示。找到
- 这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的。如果在子类中重写final修饰的方法,在编译阶段就会提
- 批量添加一对多中间表建立中间表A,一个id对应多个lid;传入两条参数long id;//单个数值List lid;//集合数值dao层语句
- synchronized 和 Reentrantlock多线程编程中,当代码需要同步时我们会用到锁。Java为我们提供了内置锁(synchr
- 本文实例为大家分享了C#用NPOI导出导入Excel帮助类的具体代码,供大家参考,具体内容如下1、准备工作在管理NuGet程序包中搜索 NP
- 目录前言反射基础数据准备基于反射创建对象获取反射中的对象获取类中属性获取类中的构造方法获取类中方法结语前言大家好,瑞雪后的第一天,每个周一的