• 窗体间传递复杂数据


     

    源代码下载请点这里

    在设计窗体程序时往往需要相互调用的窗体间传递复杂的数据,有时候甚至需要子窗体修改父窗体的内容。前一阵在博客园中看到很多人讨论这个问题,在海天一鸥《窗体间传值和窗体间互操作》的评论中,我看到有这么几种做法:1)公开一个静态变量;2)在子窗体中创建一个公有字段;3)在父窗体中使用委托与事件;4)将子窗体作为父窗体成员。

    这些办法我感觉都不是特别好,会导致父窗体与子窗体耦合过于紧密,对任何一个窗体的修改需要重新编译另外一个窗体。根据“依赖倒置”的原则,通过引入一个结果对象,就可以避免这种紧耦合,同时也可以传递任意复杂的数据。如果需要在子窗体中改变父窗体状态,也可以在这个结果对象中定义委托与事件来达到目的。我在这里给出我的解决方案。

    首先定义一个结果对象,用来存放子窗体返回的结果。同时定义一些事件,可以让子窗体修改父窗体的状态。代码如下:

    using System;

    namespace WinParam
    {
       
    public delegate void TextChangedHandler(string s);

       
    public class cResult
       
    {
          
    public string Result1 = "";
          
    public string Result2 = "";
          
          
    public event TextChangedHandler TextChanged;

          
    public void ChangeText(string s)
          
    {
             
    if(TextChanged != null)
                TextChanged(s);
          }

       }

    }

    添加一子窗体构造函数,允许接收一结果对象:

    private cResult r;

    public frmChild(cResult r):this()
    {
       
    this.r = r;            
    }

    在父窗体中创建子窗体,并订阅cResult事件:

    private void btnCallChild_Click(object sender, System.EventArgs e)
    {
       cResult r 
    = new cResult();
       r.TextChanged 
    += new TextChangedHandler(this.EventResultChanged);
       frmChild fc 
    = new frmChild(r);
       fc.ShowDialog();
       txtCallResult.Text 
    = "The Result is: " + r.Result1 + " " + r.Result2;
    }


    private void EventResultChanged(string s)
    {
       txtEventResult.Text 
    = s;
    }

    这样确保父窗体知道子窗体,而子窗体不知道父窗体。父窗体改变后不需要重新编译子窗体。同时两个窗体都依赖于结果对象,结果对象的稳定性也决定了父窗体与子窗体关系的稳定性。下面是程序运行结果:



    注:提供的代码仅仅是功能演示,如果实际使用需要添加一些额外辅助代码(对象释放、取消事件订阅等)。
  • 相关阅读:
    重新理解js的执行环境和闭包
    给开发插上想象力的翅膀
    Vue源码的初始化以及数据驱动逻辑
    解析Vue源码之前
    前端模块化发展介绍和未来展望
    现代前端框架具备的特征分析及Vue、React对比
    始于Flux的单项数据流发展简单介绍
    用面向对象编程解决常见需求场景
    【Docker】之重启容器相关命令
    【Java】之获取CSV文件数据以及获取Excel文件数据
  • 原文地址:https://www.cnblogs.com/fuyingke/p/561338.html
Copyright © 2020-2023  润新知