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 事件,然后再父窗体上添加事件,就可以实现在子窗体上操作父窗体的目的了。
C#不同窗体间数据传递的更多相关文章
- 详细介绍ASP.NET页面间数据传递的使用方法
		源码:http://www.jinhusns.com/Products/Download/?type=xcj 在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. ... 
- ASP.NET页面间数据传递的方法<转>
		ASP.NET页面间数据传递的方法 作者: 灰色的天空2 来源: 博客园 发布时间: 2010-10-28 11:06 阅读: 822 次 推荐: 0 原文链接 [收藏] 摘要:本 ... 
- ASP.NET中实现页面间数据传递的方法
		说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好. ASP.NET页面间数据传递 ... 
- ASP.NET 页面间数据传递的方法
		在做WEB开发时,很多地方会涉及到页面间的数据传递.这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下: 说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是 ... 
- [转]Angular2-组件间数据传递的两种方式
		本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一 ... 
- Java并发:线程间数据传递和交换
		转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ... 
- Angular2-组件间数据传递的两种方式
		Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一种是用单例模块传递:有两个元数据具有传递数据的功能:inputs和outputs. 一.元数据传递 1 ... 
- vue 组件间数据传递
		父组件向子组件传值 方法一: 子组件想要使用父组件的数据,需要通过子组件的 props 选项来获得父组件传过来的数据. 1.父组件parent.vue中代码: <template> < ... 
- postman-接口间数据传递
		接口间数据传递 在我们做接口测试过程中会经常碰到使用上一个接口返回数据的情况,jmeter中可通过正则表达式提取,postman中如何提取呢?我们来看实例,这里使用的同一个接口来演示.  我们提取出 ... 
随机推荐
- Codeforces 1083B The Fair Nut and Strings
			Description 给定两个由 \('a'\), \('b'\) 组成的字符串 \(a\), \(b\),以及两个整数 \(n\) 和 \(k\) \(n\) 表示字符串 \(a\),\(b\) ... 
- qt布局管理-缩放、多窗口切换
			关于缩放的布局 所有控件要求与主窗口同时缩放,那么在所有控件设置好布局后,最后点击最外侧的主控件,选择水平布局或者垂直布局即可. 另外每个空间的属性可更改,如SizePolicy用于设置空间是否可缩放 ... 
- /lib/lsb/init-functions
			lsb_functions="/lib/lsb/init-functions" if test -f $lsb_functions ; then . $lsb_functions 
- 【Selenium】【BugList5】chrom窗口未关闭,又新开窗口,报错:[8564:8632:0522/111825.341:ERROR:persistent_memory_allocator.cc(845)] Corruption  detected in shared-memory segment.
			环境信息:Windows7 64位 + python 3.6.5 + selenium 3.11.0 +pyCharm 解决方法: 执行 driver = webdriver.Chrome()前必须把 ... 
- jmeter本身的一个bug记录
			1.使用jmeter测http接口 2.断言接口返回的内容是否包含某串文本 3.结果:总是返回断言失败,即使接口返回的内容包含了该文本 接口返回的值为: {"code":" ... 
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第7周学习总结
			20175316盛茂淞 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 第八章 常用实用类 一.String类 String类在java.lang包中,jav ... 
- Hibernate中的实体规则、对象状态和进阶-一级缓存
			一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ... 
- Codeforces 863 简要题解
			文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ... 
- Rabbimq 安装过程,还有踩得坑!centos 安装
			一 .安装erlang 1 添加yum 源,在/etc/yum.repos.d 下添加 rabbitmq-erlang.repo,内容如下 # In /etc/yum.repos.d/rabbitmq ... 
- shell传递参数
			简单介绍python的脚本传参 我们知道python脚本传递参数,有一个很方便的方式-sys.argv.它将脚本本身名字和后面的各项参数都放入一个列表. 使用的时候,索引这个列表就可以了.例如: py ... 
