C#窗体间传递复杂数据

转载 2006年06月18日 16:13:00

在设计窗体程序时往往需要相互调用的窗体间传递复杂的数据,有时候甚至需要子窗体修改父窗体的内容。前一阵在博客园中看到很多人讨论这个问题,在海天一鸥《窗体间传值和窗体间互操作》的评论中,我看到有这么几种做法: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;
}


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



注:提供的代码仅仅是功能演示,如果实际使用需要添加一些额外辅助代码(对象释放、取消事件订阅等)。

为了让系统更为稳定,通常程序在编写时都遵循高内聚,松耦合的原则。虽然代码复杂了很多,但保证了松耦合。这样当两个窗体的代码发生变化时,不至于对另外一个窗体产生影响。

释放、取消事件订阅通常在子窗体释放时调用。

相关文章推荐

窗体间传递复杂数据

在设计窗体程序时往往需要相互调用的窗体间传递复杂的数据,有时候甚至需要子窗体修改父窗体的内容。前一阵在博客园中看到很多人讨论这个问题,在海天一鸥《窗体间传值和窗体间互操作》的评论中,我看到有这么几种做...

C#窗体间传递数据

一、从Form1(主窗体)把数据传递给Form2(新窗体) 举例: 比如要将Form1中的一个TextBox(frm1_txt)中的值传给Form2 方法:通过重载Form2的构造函数 ...

C#成神之路 <22> 窗体跳转以及数据传递

这里的知识内容参考网络层面较多: 设计窗体数据传递必然少不了委托和事件,我参考的学习资料: 委托和事件的基础解释一位大手的白话解释委托和事件对窗体数据传递方法的详细介绍感谢上面诸多大手的奉献。下面...

C# 利用接口在窗体间传递消息(很基础很实用)

接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。我们在实际开发中,经常要用到在窗体间传递数据。很多情况下,我们用委托把数据从子窗体传递到主窗体,这个例子我们来看...

C#窗体之间数据传递

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)