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 事件,然后再父窗体上添加事件,就可以实现在子窗体上操作父窗体的目的了。

  • 相关阅读:
    查windows系统开关机记录
    HDU-6278-Jsut$h$-index(主席树)
    POJ-2104-Kth Number(主席树)
    HDU-6546-Function(贪心)
    POJ-1523-SPF(求割点)
    POJ-2762-Going from u to v or from v to u(强连通, 拓扑排序)
    POJ-2552-The Bottom of a Graph 强连通分量
    POJ-1659-Frogs' Neighborhood
    POJ-1904-King‘s Quest
    POJ-1236-Network of Schools
  • 原文地址:https://www.cnblogs.com/zterry/p/6604822.html
Copyright © 2011-2022 走看看