源代码下载请点这里
在设计窗体程序时往往需要相互调用的窗体间传递复杂的数据,有时候甚至需要子窗体修改父窗体的内容。前一阵在博客园中看到很多人讨论这个问题,在海天一鸥《窗体间传值和窗体间互操作》的评论中,我看到有这么几种做法: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;
}这样确保父窗体知道子窗体,而子窗体不知道父窗体。父窗体改变后不需要重新编译子窗体。同时两个窗体都依赖于结果对象,结果对象的稳定性也决定了父窗体与子窗体关系的稳定性。下面是程序运行结果:

注:提供的代码仅仅是功能演示,如果实际使用需要添加一些额外辅助代码(对象释放、取消事件订阅等)。
ArrayList去除集合中字符串的重复值
scrum项目冲刺_day09
scrum项目冲刺_day08
scrum项目冲刺_day07
scrum项目冲刺_day06
scrum项目冲刺_day05
scrum项目冲刺_day04
scrum项目冲刺_day03
scrum项目冲刺_day02
- 最新文章
-
tomcat-7.0.30安装及配置
iPhone/android的viewport 禁止页面自动缩放
我们无法在此设备上激活windows,因为无法连接到你的组织的激活服务器。请确保已连接到你的组织服务器,然后重试。如果仍存在激活问题,请联系组织的支持人员,错误代码:ox80070078
摘抄003
BUG06
BUG05
BUG04-【POJO的重载构造器异常】mybatis的xml查询字段后向外映射数据字段类型一致报错 “不匹配、匪夷所思的一些无法转换的异常”
BUG03- 【MP的批量操作不能插入空集合】com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: error: entityList must not be empty
BUG02 -【环境冲突,还是看官方文档】 mp版本从3.1.0及以下版本升级到高版本,JDK8日期新类型LocalDateTime等无法映射(报错)
发现BUG01

