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


    要做到类似于这样的效果

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

    委托和事件的区别: 

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

  • 相关阅读:
    虚方法与非虚方法,native关键字
    Java多态
    Java对象初始化顺序
    继承、初始化
    递归,斐波那契,对象类型数组
    方法重载
    可变形参
    idea
    ss 如何解决margin-top使父元素margin失效
    js中call和apply的用法和区别
  • 原文地址:https://www.cnblogs.com/T-J-D/p/6245438.html
Copyright © 2020-2023  润新知