总结窗体间传值的几种方法

时间:2022-04-17 06:05:58

要做到类似于这样的效果

第一种:更改子窗体控件属性为public

1、更改子窗体textbox的Modifiers属性为public

2、在主窗体中添加一个子窗体的属性

实例化一个子窗体修改他的textbox的text属性即可

public ChildFrm ChildFrm { get; set; } private void ParFrm_Load(object sender, EventArgs e) { ChildFrm child = new ChildFrm(); ChildFrm = child; child.Show(); } private void button1_Click(object sender, EventArgs e) { ChildFrm.childTxt.Text = this.parTxt.Text; }

父窗体直接操作子窗体的一个属性,并不是很合适,,至少应该将它封装为一个子窗体的方法,让别人调用,子窗体做验证之后再修改

(类似于别人让你去买一瓶酱油,你应该自己去买,而不是别人从你口袋里直接掏钱去买了)

改进一下,先将子窗体textbox空间的Modifiers属性为private

子窗体加入代码:

public void SetTextbox(string str) { this.childTxt.Text = str; //可以做一些校验 }

父窗体修改代码为:

public ChildFrm ChildFrm { get; set; } private void ParFrm_Load(object sender, EventArgs e) { ChildFrm child = new ChildFrm(); ChildFrm = child; child.Show(); } private void button1_Click(object sender, EventArgs e) { ChildFrm.SetTextbox(this.parTxt.Text); //调用了子窗体的方法 }

这样能体现一些面向对象的思想

第二种:用委托,发布订阅模式,观察者模式

目前主窗体和子窗体直接耦合

现在希望子窗体个数不确定,中间子窗体可以添加也可以减少,主窗体代码都不受太大影响

就要先将窗体解耦

public Action<string> AfterMsgSend; //定义一个无返回值的发送消息委托private void ParFrm_Load(object sender, EventArgs e) { ChildFrm frm = new ChildFrm(); //初始化子窗体 AfterMsgSend += frm.SetTextbox; //把子窗体的方法注册到主窗体中去 frm.Show(); } private void button1_Click(object sender, EventArgs e) //不管有多少个子窗体,主窗体的button按钮中的代码都不需要修改 { if (AfterMsgSend != null) //判断有没有多播委托加入 { AfterMsgSend(this.parTxt.Text); //还是调用childFrm中的方法 } }

第三种:用事件,更具有安全性

public event Action<string> AfterMsgChange; private void ParFrm_Load(object sender, EventArgs e) { ChildFrm frm = new ChildFrm(); AfterMsgChange += frm.SetTextbox; frm.Show(); } private void button1_Click(object sender, EventArgs e) { if (AfterMsgChange!=null) { AfterMsgChange(parTxt.Text); } }

委托和事件的区别: 

委托是一个类型,事件是委托类型的一个特殊实例,事件只能在当前类的内部触发执行

总结窗体间传值的几种方法