您的位置:首页 > 其它

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

2017-01-03 16:54 288 查看
要做到类似于这样的效果



第一种:更改子窗体控件属性为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);
}
}


委托和事件的区别:

委托是一个类型,事件是委托类型的一个特殊实例,事件只能在当前类的内部触发执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: