在多窗口编程中。各个窗口之间的数据传递是件伤神的事情,我以前用的最多的是在一个窗口建立一个公共字段,或创一个公共函数,将窗口的实例传递到下一个窗口,在另外一个窗口中可以对这个公共字段和公共函数进行操作,这样子的实现能满足大部的需求。例如在一个有进度条的操作中,我可以在子窗口中暴露一个对进度条操作的只写属性,每次父窗口改写进度值子窗口都用这个值去更新进度条,实现进度百分比的效果。
今天在吕老师的Blog上看到了一个新的实现方法。以前的实现方法都是窗口与窗口之间的交换。结合的比较紧密,如果涉及的窗口比较多的话。一方发生更改。那涉及的代码量就比较大了。他的思路是在窗体与窗体之间增加一个中介。这样让窗体间的结合度降低,一旦需求改变,只需要改变中介了。达到了偷懒的目的。中介类的代码如下:





















这里面定义了一个委托和一个事件,还有两个事件,我们就是通过这个委托和事件达到数据传递的目的的。
这是建立的父窗口,
这是建立的子窗口,我们就在这里改变一些值,然后这些改动会在父窗口中自动的反映出来。
这是父窗口的实现代码
















这代码里我们建立一个对象Result,并给事件订阅了处理程序,然后将Result对象的实例传给了Form2.在Fom2中我们需要重与构造函数,以获得对Result的引用。
1
private Result R;
2
public Form2(Result r):this()
3
{
4
this.R=r;
5
}
6
private void button1_Click(object sender, System.EventArgs e)
7
{
8
R.Result1=textBox2.Text;
9
R.Result2 =textBox3.Text;
10
R.ChangedText(textBox1.Text.Trim());
11
}
这里触发了事件。最终结果将在父窗口中反应出来。运行结果:
2

3

4

5

6

7

8

9

10

11
