C#不同窗体间通信,数据传递
2007-07-17 13:21
330 查看
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录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值也同理可以做到。
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值也同理可以做到。
相关文章推荐
- C#不同窗体间通信,数据传递
- 如何在不同窗体中传递数据
- 在两个不同的Form窗体中的DataGridView数据“传递”
- 不同窗体传递数据
- 安卓--页面跳转,不同窗体传递数据
- C#中不同窗体之间的数据传递
- Visual C#实现不同窗体间数据传递之三
- 在不同gui 中传递数据的完美解决方法
- C#.NET常见问题(FAQ)-如何在不同窗体之间传递值
- 利用Intent在不同的activity之间传递数据
- 窗体中的选中数据传递给报表
- WinForm中窗体间的数据传递(二)
- 通信组件之Intent的复杂数据的传递
- Android(java)学习笔记221:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)
- Android 数据传递(二)Activity与fragment之间的通信
- 安卓用Intent在不同的Activity传递数据
- Jquery下Json数据的传递与解析(asp.net mvc与asp.net api下后台json接收方式的不同)
- 窗体之间传递数据
- 通过Bundle传递不同Intent之间的原始数据
- 总结C#中窗体间传递数据的几种方法