在多窗口编程中。各个窗口之间的数据传递是件伤神的事情,我以前用的最多的是在一个窗口建立一个公共字段,或创一个公共函数,将窗口的实例传递到下一个窗口,在另外一个窗口中可以对这个公共字段和公共函数进行操作,这样子的实现能满足大部的需求。例如在一个有进度条的操作中,我可以在子窗口中暴露一个对进度条操作的只写属性,每次父窗口改写进度值子窗口都用这个值去更新进度条,实现进度百分比的效果。
今天在吕老师的Blog上看到了一个新的实现方法。以前的实现方法都是窗口与窗口之间的交换。结合的比较紧密,如果涉及的窗口比较多的话。一方发生更改。那涉及的代码量就比较大了。他的思路是在窗体与窗体之间增加一个中介。这样让窗体间的结合度降低,一旦需求改变,只需要改变中介了。达到了偷懒的目的。中介类的代码如下:
using System;
namespace Test
{
public delegate void TextChangedHandler(string s);
public class Result
{
public string Result1;
public string Result2;
public event TextChangedHandler TextChanged;
public void ChangedText(string s)
{
if(TextChanged!=null)
{
TextChanged(s);
}
}
}
}
namespace Test
{
public delegate void TextChangedHandler(string s);
public class Result
{
public string Result1;
public string Result2;
public event TextChangedHandler TextChanged;
public void ChangedText(string s)
{
if(TextChanged!=null)
{
TextChanged(s);
}
}
}
}
这里面定义了一个委托和一个事件,还有两个事件,我们就是通过这个委托和事件达到数据传递的目的的。
这是建立的父窗口,
这是建立的子窗口,我们就在这里改变一些值,然后这些改动会在父窗口中自动的反映出来。
这是父窗口的实现代码
Result r=new Result();
private void button1_Click(object sender, System.EventArgs e)
{
r.TextChanged+=new TextChangedHandler(this.TextChangedEve);
Form2 frm=new Form2(r);
frm.Show();
}
private void TextChangedEve(string s)
{
textBox2.Text =r.Result1 +r.Result2 ;
textBox1.Text =s;
}
private void button1_Click(object sender, System.EventArgs e)
{
r.TextChanged+=new TextChangedHandler(this.TextChangedEve);
Form2 frm=new Form2(r);
frm.Show();
}
private void TextChangedEve(string s)
{
textBox2.Text =r.Result1 +r.Result2 ;
textBox1.Text =s;
}
这代码里我们建立一个对象Result,并给事件订阅了处理程序,然后将Result对象的实例传给了Form2.在Fom2中我们需要重与构造函数,以获得对Result的引用。
1private 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 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 }