总结窗体间传值的几种方法
要做到类似于这样的效果
第一种:更改子窗体控件属性为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); } }
委托和事件的区别:
委托是一个类型,事件是委托类型的一个特殊实例,事件只能在当前类的内部触发执行