zoukankan      html  css  js  c++  java
  • C#不同窗体间数据传递

    在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念。最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道。

    1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记录的ID,为了避免每个窗体都去查询数据库,可以把这些公共变量或信息写入配置文件,每个窗体去读配置文件即可。

    2.       如果共享信息的窗体不多,则对于兄弟窗口,可以通过其共同的父窗体来传递数据,此时父窗体如果是容器,只需要在本窗口中定义一个指向父窗体的变量即可,当然不需要NEW的。

        如:父窗体form1两个子窗体subform1 subform2,均在由父窗体通过NEW得到,且均定义为全局公共变量,即在所有成员函数外定义为public。我们希望把子窗体1即subform1中textbox的内容传递到子窗体2即subform2的textbox中,可以这样做:

        先设父窗体的属性mdicontainer=true。

        在subform2中:Form1 parentform=(Form1)this.mdiparent; 

        此时,在subform2中便可以通过:this.textbox.text=parentfrom.subform1.textbox.text  ,将subform1 中textbox的值赋给了subform2的textbox。

        同理,也可以在subform2中直接修改subform1.textbox的值:parentfrom.subform1.textbox.text=”XXXX”。当然这样做的前提是这些控件如textbox都必须声明成public。

    3.       父子窗体间传递数据。form1是父窗体,form2是子窗体,form2由form1直接NEW得到,两窗体中均含有public型的textbox1。父窗体向子窗体传递数据是相当容易的,只需把子窗体中的控件或变量声明为public,直接在窗体中修改即可。但子窗体向父窗体传递数据就没那么简单了。当然我们可以采用上述的第二种方法,不过此时父窗体是容器,如果里面还要放其它控件,必须用panel装起来。如果不想父窗体成为容器,可以通过把父窗体通过子窗体的构造函数传递给子窗体,子窗体中有一个变量指向窗体即可。子窗体构造函数: 

        public Form1 frm1;
        public Form2(Form1 frm1)
        {    
            InitializeComponent();
            this.frm1 = frm1;
         }

    在父窗体中new子窗体:Form2frm2 =new Form2(this);之后就可以随便修改子窗体中声明为public的变量或控件了,如frm2.textBox1.Text=”good”;。通过子窗体的构造函数我们可以看到,子窗体有一个变量指向父窗体,相当于一个指针。这样在子窗体中可以直接访问父窗体: this.frm1.textBox1.Text ="good";我们返回去看发现父窗体的textbox1.text确实变成了good。如果在窗体中将frm2定义为public型,那么就可以循环访问了。如this.frm1.frm2.frm1.frm2.frm1.frm2….无穷下去。所以尽量避免将其定义为全局public型,同时不要写出上述循环访问的语句。显然,我们可以用这种方法代替第二种方法,即使父窗体不是容器,我们也照样可实现兄弟窗体间数据的传递,当然前提是窗体都处于打开状态。假设现在又有一个子窗体form3,此时,必须在父窗体中把两个子窗体都定义成public:Form2frm2 = new Form2(this)  ; Form3frm3 =newForm3(this)。如果Form2访问Form3,在Form2中,通过如下方式:string text=this.frm1.frm3.textbox1.text便取得了Form3中textbox1的text值。在Form2中修改Form3中textbox1的text值也同理可以做到。

    4.上例子

    比如说Form1上有一个button1,Form2上有一个textBox1和一个button1。

    class Form1:Form
    {
       public string Str;
       private void button1_Click(object sender, EventArgs e)
       {搜索
           Form2 f2=new Form2();
           f2.f1=this;
           f2.show();
        }
    }
    class Form2:Form
    {
        public Form1 f1;
    private void button1_Click(object sender, EventArgs e)
        {
           f1.Str=this.textBox1.Text;
        }
    } 

     

    5.事件传递。

    在子窗体上创建public 事件,然后再父窗体上添加事件,就可以实现在子窗体上操作父窗体的目的了。

  • 相关阅读:
    AX 2012 Security Framework
    The new concept 'Model' in AX 2012
    How to debug the SSRS report in AX 2012
    Using The 'Report Data Provider' As The Data Source For AX 2012 SSRS Report
    Deploy SSRS Report In AX 2012
    AX 2012 SSRS Report Data Source Type
    《Taurus Database: How to be Fast, Available, and Frugal in the Cloud》阅读笔记
    图分析理论 大纲小结
    一文快速了解Posix IO 缓冲
    #转载备忘# Linux程序调试工具
  • 原文地址:https://www.cnblogs.com/zterry/p/6604822.html
Copyright © 2011-2022 走看看