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