在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念。最常见的是父子窗体之间的数据传递,比如登录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#不同窗体间数据传递的更多相关文章

  1. 详细介绍ASP.NET页面间数据传递的使用方法

    源码:http://www.jinhusns.com/Products/Download/?type=xcj 在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. ...

  2. ASP.NET页面间数据传递的方法<转>

    ASP.NET页面间数据传递的方法 作者: 灰色的天空2  来源: 博客园  发布时间: 2010-10-28 11:06  阅读: 822 次  推荐: 0   原文链接   [收藏]   摘要:本 ...

  3. ASP.NET中实现页面间数据传递的方法

    说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好.   ASP.NET页面间数据传递 ...

  4. ASP.NET 页面间数据传递的方法

    在做WEB开发时,很多地方会涉及到页面间的数据传递.这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下: 说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是 ...

  5. [转]Angular2-组件间数据传递的两种方式

    本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一 ...

  6. Java并发:线程间数据传递和交换

    转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ...

  7. Angular2-组件间数据传递的两种方式

    Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一种是用单例模块传递:有两个元数据具有传递数据的功能:inputs和outputs. 一.元数据传递 1 ...

  8. vue 组件间数据传递

    父组件向子组件传值 方法一: 子组件想要使用父组件的数据,需要通过子组件的 props 选项来获得父组件传过来的数据. 1.父组件parent.vue中代码: <template> < ...

  9. postman-接口间数据传递

    接口间数据传递 在我们做接口测试过程中会经常碰到使用上一个接口返回数据的情况,jmeter中可通过正则表达式提取,postman中如何提取呢?我们来看实例,这里使用的同一个接口来演示. ​ 我们提取出 ...

随机推荐

  1. 归并排序之python

    想更好的了解归并排序, 需先了解, 将两个有序列表, 组成一个有序列表 有两个列表  l1 = [1, 3, 5, 7] l2 = [2, 4, 6] 需要将 l1 和 l2 组成一个 有序大列表   ...

  2. pclConfig.cmake or PCLConfig.cmake

    Could not find a package configuration file provided by "pcl" (requested  version 1.8) wit ...

  3. IMPLEMENTATION - Entity Framework Anti Pattern - High Performance EF

    Good about ORM Developer is free from building T-Sql on the database tier which is not their major a ...

  4. Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理

    https://codeforces.com/contest/1101/problem/F 题意 有n个城市,m辆卡车,每辆卡车有起点\(s_i\),终点\(f_i\),每公里油耗\(c_i\),可加 ...

  5. 线程中的setDaemon方法

    setDaemon方法必须在start方法前定义.t1.setDaemon(True),该语句的意思是:将主线程A设置为子线程t1的守护线程.也就是在执行程序时,t1会随着主线程A的退出而退出,不论t ...

  6. 1013. Battle Over Cities 用dfs计算联通分量

    使用一个标记数组,标记 节点是否已访问 int 连通度=0 dfs(node i) {标记当前节点为以访问 for(每一个节点) {if(当前几点未访问 并且 从i到当前节点有直接路径) dfs(当前 ...

  7. 手把手教你利用Python自动下载CL社区图片

    需求描述:     最近发现CL社区上好多精华的帖子分享的图片非常棒,好想好想保存下来,但是一张一张地保存太费时间了,因此,造物者思想主义的我就想动手写个工具,实现只要输入帖子的链接,就能把所有的精华 ...

  8. Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题

    这个问题,主要还是在移动平台下开发导致的. 在编辑器里调试加载AB时会导致Shader效果不正确的原因,主要还是编辑器下加载以IOS或是ANDROID平台打包的AB它所使用的shader已经编译成对应 ...

  9. 点击a标签的文字后页面的跳转

    1.方法一 (1)js var html=""; html+="<a href=\"#\" onclick=\check('"+id+ ...

  10. SQL语言基础学习

    9.26.对之前学习的知识进行一下梳理,同时结合所查资料对知识进行一次整合