C#开发Winform实现窗体间相互传值
目录
一、前言二、公共属性三、公共方法四、委托1、定义一个委托2、实例化一个此委托类型的事件3、定义要执行的方法4、将方法绑定到事件5、触发委托一、前言
我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值。假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现。
二、公共属性
我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面给公共属性赋值,这样可以实现窗体之间传值,子窗体代码如下:
using System;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class frmChild : Form
{
public frmChild()
{
InitializeComponent();
}
// 定义一个公共属性,接收传递的值
public string strMessage { get; set; }
///
/// 窗体加载
///
///
///
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();
}
///
/// 单击事件
///
///
///
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; }
///
/// 给私有属性赋值
///
///
public void SetText(string strText)
{
strMessage = strText;
}
///
/// 窗体加载
///
///
///
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();
}
///
/// 单击事件
///
///
///
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、定义要执行的方法
这里其实就是在子窗体里面定义一个给控件赋值的方法:
////// 给控件赋值的方法 /// /// 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 actionEvent;
public frmParent()
{
InitializeComponent();
}
///
/// 单击事件
///
///
///
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://github.com/jxl1024/FromPassValueDemo
到此这篇关于C#开发Winform实现窗体间相互传值的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?

