日期:2014-06-10  浏览次数:20699 次

前言

  做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式。

共有字段传递

  共有字段传递实现起来很方便,就是在窗体类中加个共有字段属性:

1         public string Msg
2         {
3             get 
4             {
5                 return this.textBox1.Text.Trim();
6             }
7         }

  调用代码:

1         public Form2(Form1 f1)
2         {
3             InitializeComponent();
4             this.label1.Text = f1.Msg;
5         }

  就这么简单,共有字段传递其实只是一种可以传递数据的方式,但不希望采用这种方式,除非一些窗体是要做传值的,比如一些信息弹窗,可以采用这种方式。

构造传递

  构造传递一般是我们做项目常用的一种,就像对象传值一样,我们只要在构造方法中添加参数即可。

 1         public Form2(string msg)
 2         {
 3             InitializeComponent();
 4             this.label1.Text = msg;
 5         }
 6 
 7         private void button1_Click(object sender, EventArgs e)
 8         {
 9             Form2 f2 = new Form2(this.textBox1.Text.Trim());  //调用
10             f2.Show();
11         }

委托与事件传递

  上面说的两种方式都是由父窗体传值给子窗体,还有一种方式是子窗体传值给子船体,这种方式一般采用委托和事件传递,我们来做个示例看下。

  我们先建一个委托,参数是string:

1     public delegate void selectChangedHandler(string s);

  在传值中我们需要第二种方式来传递一个对象集合,首先我们建一个数据传递集合:

 1     public class CallObject
 2     {
 3         public string callMessage = "";
 4         public event selectChangedHandler selectChangedEvent;
 5 
 6         public void callEvent(string s)
 7         {
 8             this.selectChangedEvent(s);
 9         }
10     }

  集合包含两个部分,一个是返回信息对象,一个是事件对象,这些其实以便子窗体调用来得到从子窗体中传递过来的数据,事件定义好了就得有事件处理方法:

1         public void co_selectChangedEvent(string s)
2         {
3             this.txtF2Select.Text = s;
4         }

  我们看下父窗体的调用方法:

1         private void btnCallForm2_Click(object sender, EventArgs e)
2         {
3             CallObject co = new CallObject();
4             co.selectChangedEvent+=new selectChangedHandler(co_selectChangedEvent);
5             Form2 f2 = new Form2(co);
6 
7             f2.ShowDialog();
8             txtEventResult.Text = "Form2传的信息:" + co.callMessage;
9         }

  这边主要是给事件注册,从父窗体中我们就可以推断出,子窗体是怎么调用的,通过构造方法得到对象集合,然后触发事件就可以了。

 1         private CallObject co;
 2         public Form2(CallObject cov):this()
 3         {
 4             this.co = cov;
 5         }
 6 
 7         private void rb_A_CheckedChanged(object sender, EventArgs e)
 8         {
 9             co.callEvent("A");
10         }

  运行效果:

  下面传值给父窗体的值需要关闭子窗体,父窗体再可以得到,上面的可以实时传递。

  程序下载:窗体间传递数据.rar

  附录:小菜学习编程-Winform系列(初学者)

后记

  其实上面第一种并不能说是一种好的方式,就像说模式,常用并且可以解决问题的解决方案称为模式,开门有几种方式:拿钥匙开门和撬门,我们常用的是第一种,并称为一种开门模式,并不是说第二种就不是了,只不过我们不常用,适合一些特殊的情况,比如,忘记拿钥匙了,就是这个意思。