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

要做到类似于这样的效果

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

委托和事件的区别: 

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

原文地址:https://www.cnblogs.com/T-J-D/p/6245438.html