zoukankan      html  css  js  c++  java
  • 使用事件和委托再两个窗体之间传递数据(原创)

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

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

  • 相关阅读:
    元素定位不到的问题,Timeout,nosuch element,unable locate等
    webpack的安装
    Mysql修改表
    Mysq表的创建和l数据类型
    Mysql的库操作
    面向对象的序列化和反序列化
    类的关键字:final、const
    面向对象接口以及和继承的混合案例
    DOM创建移除替换元素
    抽象类
  • 原文地址:https://www.cnblogs.com/guozhe/p/2862399.html
Copyright © 2011-2022 走看看