小菜学习Winform(五)窗体间传递数据

前言

  做项目的时候,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系列(初学者)

后记

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

 

你可能感兴趣的:(WinForm)