zoukankan      html  css  js  c++  java
  • 总结窗体间传值的几种方法

    要做到类似于这样的效果

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

    委托和事件的区别: 

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

  • 相关阅读:
    美赛 LaTeX 急救指南
    切比雪夫定理的证明
    【持续更新】一个简洁、易用的美赛 LaTeX 模板: easymcm
    一个形式较精细的 Strling 公式的证明
    数学分析的主线,高等数学的一切:连续函数与“有理”分析
    一个自己稍作修改了的美赛论文 LaTeX 模板
    有关几个特殊命题的证明
    实数系与实数定理(下)
    实数系与实数定理(上)
    Office365完整离线安装包下载及自定义安装教程
  • 原文地址:https://www.cnblogs.com/T-J-D/p/6245438.html
Copyright © 2011-2022 走看看