使用事件和委托再两个窗体之间传递数据(原创)
一般情况下,在form1中使用如下方法显示form2
void showform2() { form2 frm2=new form2();//创建form2的新实例 //显示窗体 frm2.show();//或者frm2.ShowDialog() }
以上做法中如果把以下语句声明为窗体级变量的话:
form2 frm2=new form2();//创建form2的新实例
这样可以在整个窗体中使用frm2这个实例,只要再frm2中声明公共变量或者把控件设为共有就可以放变得操作frm2中的数据了,从而达到由form1到form2的数据传递。
但是这种方法是单向的,如果想把form2的数据传回form1的话,以上方法就不能实现了。刚刚在论坛上看到了几种窗体间传递数据的方法,其中利用事件和委托的方法没有详细介绍,自己试做了一下,并成功实现了功能,一下是详细的使用方法:
1.在窗体form2中做以下工作 public delegate void dlsetform1(string ss);//声明一个委托 public event dlsetform1 evsetform1; //声明一个事件 private void DoSomething()//这个方法是为了把事件触发处理放在一起可以再应用时按需修改 //一个触发事件的方法,当这个方法被执行时,事件evsetform1开始运作了 { dlsetform1 tempdl=evesetform1;//初始化事件,现在事件已经委托给了tempdl tempdl("这是一次测试!");//tempdl执行,从而事件被触发了 } //可以再form2中的任意事件里触发事件,例如再窗体中一个按钮的单击事件中触发他 private void button1_Click(object sender, EventArgs e) { DoSomehing(); } //嘿嘿,窗体2的工作完成了是不是很简单啊。 2.现在开始操作窗体form1,我们改一下刚才那个显示窗体2的方法 void showform2() { form2 frm2=new form2();//创建form2的新实例 //此处把frm2的evsetform1事件绑定到一个方法上, frm2.evsetform += frm2_SetForm1;
//当evsetform1被触发时,这个方法将被执行注意,这个方法与form2中的委托dlsetform2的一致性 //显示窗体 frm2.show();//或者frm2.ShowDialog() }
//form2事件触发时执行的方法,其中的ss是form2传递过来的数据 private void frm2_SetForm1(string ss) { this.text=ss;//这里把窗体form1的text属性设置为了frm2传递来的数据"这是一个测试!" }
做到这里就大功告成了。是不是挺容易的。希望对于看到这篇文章的人可以有所启发。