使用事件和委托再两个窗体之间传递数据(原创)

一般情况下,在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传递来的数据"这是一个测试!"     } 

    做到这里就大功告成了。是不是挺容易的。希望对于看到这篇文章的人可以有所启发。

你可能感兴趣的:(事件)