父子窗体之间传值
需求说明
当点击父窗体的按钮时,父窗体的文本框中的内容显示在子窗体的label 中
以下是控件名称:
父窗体文本框: txtMsg
按钮:button1
子窗体label:lblMsg
方式一
在子窗体 frmChildren 中定义如下方法,提供子窗体label控件 Text 属性的设置
public void setMsg(string msg)
{
this.lblMsg.Text = msg;
}
接着在父窗体中 定义一个 子窗体frmChildren 的字段,编写点击事件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class FrmParent : Form
{
public FrmParent()
{
InitializeComponent();
}
//定义子窗体 字段
private FrmChildren frmChildren;
private void FrmParent_Load(object sender, EventArgs e)
{
frmChildren = new FrmChildren();
frmChildren.Show();
}
private void button1_Click(object sender, EventArgs e)
{
//点击事件,通过子窗体提供的label Text 属性设置方法进行设置
frmChildren.setMsg(this.txtMsg.Text);
}
}
}
方式二 发布订阅模式(观察者模式)委托版本
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class FrmParent : Form
{
public FrmParent()
{
InitializeComponent();
}
private FrmChildren frmChildren;
//定义委托
private Action<string> afterMsgSend;
private void FrmParent_Load(object sender, EventArgs e)
{
frmChildren = new FrmChildren();
//子窗体订阅父窗体,处理父窗体的变化
afterMsgSend += frmChildren.setMsg;
frmChildren.Show();
}
private void button1_Click(object sender, EventArgs e)
{
//方式二 发布订阅模式(观察者模式)
if (afterMsgSend == null)
{
return;
}
else
{
//传递父窗体的文本框的值
afterMsgSend(this.txtMsg.Text);
}
}
}
}
发布订阅模式(观察者模式) 非委托版本
定义一个接口,然后让子窗体实现其方法
public interface IMsgHandle
{
void setMsg(string msg);
}
子窗体代码如下
public partial class FrmChildren : Form,IMsgHandle
{
public FrmChildren()
{
InitializeComponent();
}
public void setMsg(string msg)
{
this.lblMsg.Text = msg;
}
}
父窗体代码如下
public partial class FrmMain : Form
{
//存放关注父窗体变化的子窗体
public List<IMsgHandle> MsgHandlesList=new List<IMsgHandle>();
public FrmMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (MsgHandlesList.Count==0)
{
return;
}
foreach (var item in MsgHandlesList)
{
//遍历子窗体然后调用其具体的处理活动
item.setMsg(this.txtMsg.Text);
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
FrmChildren frmChildren = new FrmChildren();
this.MsgHandlesList.Add(frmChildren);
frmChildren.Show();
}