世外桃源

C#、Asp.net相关技术

导航

Vs2003多窗口下的复杂数据传递

Posted on 2006-07-01 15:56  佚名  阅读(1012)  评论(0编辑  收藏  举报

  在多窗口编程中。各个窗口之间的数据传递是件伤神的事情,我以前用的最多的是在一个窗口建立一个公共字段,或创一个公共函数,将窗口的实例传递到下一个窗口,在另外一个窗口中可以对这个公共字段和公共函数进行操作,这样子的实现能满足大部的需求。例如在一个有进度条的操作中,我可以在子窗口中暴露一个对进度条操作的只写属性,每次父窗口改写进度值子窗口都用这个值去更新进度条,实现进度百分比的效果。
  今天在吕老师的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);
            }

        }

    }

      
}

这里面定义了一个委托和一个事件,还有两个事件,我们就是通过这个委托和事件达到数据传递的目的的。

这是建立的父窗口,

这是建立的子窗口,我们就在这里改变一些值,然后这些改动会在父窗口中自动的反映出来。

这是父窗口的实现代码

  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;
        }

这代码里我们建立一个对象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        }
这里触发了事件。最终结果将在父窗口中反应出来。运行结果: