博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中窗体间传递数据的几种方法
阅读量:4129 次
发布时间:2019-05-25

本文共 2344 字,大约阅读时间需要 7 分钟。

经常会遇到C#中窗体间传递数据,搜了一下网上的资料,做一下汇总

一个稍微复杂一点的程序一般都有两个或者更多的窗体。有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,尤其是用子窗体如何改变父窗体。这个问题已经不少人问过,在群里也为了那种方式好而争论过,昨天雨声.net问窗体间互操作的问题,让我萌生就这个问题写下这篇文章,希望对刚刚接触C#的朋友有所帮助,有疏漏之处,也希望朋友们指正,欢迎讨论。

窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,无外乎以下几种方式:

  1. 公共静态变量;
  2. 使用共有属性;
  3. 使用委托与事件;
  4. 通过构造函数把主窗体传递到从窗体中;
  5. 使用中间类。

前4种方法适用的人比较多,大家也比较熟悉,我这里就不多说了,主要想详细介绍一下第五种,使用中间类的方法。比如从frm1打开frm2,在frm2中把frm1的text值改变为用户输入的字符串,并且关闭frm2。

首先先定义一个中间对象Observe

using System;

namespace demo

{
 /// <summary>
 /// Observe 的摘要说明。
 /// </summary>
 public class Observe
 {
  private string strText;
  public event EventHandler TextChange;
  public string StrText
  {
   get{return strText;}
   set
   {
    strText = value;
    if(TextChange != null)
     TextChange(this,EventArgs.Empty);
   }
  }
  public Observe()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
 }
}

在Form2中定义一个Observe成员

  private Observe o_Observer;
  public Observe observe
  {
   set
   {
    this.o_Observer = value;
   }
  }
在Form2的事件处理中改变o_Observe的StrText
  private void button1_Click(object sender, System.EventArgs e)
  {
   o_Observer.StrText = this.textBox1.Text;
   this.Close();
  }

在Form1中实例化一个Observer成员

private Observe o_Observe = new Observe();
在Form1的事件处理函数中创建Form2的实例,令Form2的observe属性等于Form1的o_Observe并且订阅Observe的事件
  private void button1_Click(object sender, System.EventArgs e)
  {
   Form2 frm = new Form2();
   frm.observe = o_Observe;
   this.o_Observe.TextChange += new EventHandler(o_Observe_TextChange);
   frm.Show();
  }

这样,Form1知道Form2,Form2不知道Form1运行结果如下:

 

 

方法1:首先,我们在Form2中定义:

private Form1 mF_Form

我们更改Form2的构造函数为有参数的

public Form2 ( Form1 myForm )

{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent ( ) ;
this.mF_Form  = myForm ;   /这样在Form1中申明Form2的时候就把Form1的实例传递过来了
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

在Form1中,我在 要用到Form2的地方申明如下:

Form2 f2=new  Form2(this);这里的this指的就是Form1当前的实例,也就是把当前Form1的实例通过Form2的构造函数传递给Form2类(其实在网上看到过比较蠢的方式,就是在构造函数里面传递要传递的信息如:字符串或是数字等,这样做很有局限性,不能传递其他的,所有我们可以直接传递实例,来完成传递更多的信息。)

这样在Form2中使用myForm 就可以对原来的Form1窗口进行操作了。但是你要把要操作的Form1中的域和函数定义成public形式的(这样可能不安全),此时的myForm就是真正的最开始打开的Form1了,你可以用这个实例来进行两个窗体的通讯了。

方法2:其实C#中提供了窗体间进行通讯的现成的属性,呵呵,我们能想到的,微软也想到了,他们创造的语言其实确实可以说是人性化了。

在Form1类中申明Form2时用如下代码:

Form2 f2=new Form2();//类Form2中的构造函数不改,还是无参的

f2.owner=this;这里的this指的是类Form1当前的实例。

//也可以使用函数的方法,给当前实例添加一个附属窗口  代码:this.AddOwnedForm(f2);

在Form2类的定义中写如下代码:

Form1 f1=this.owner;

这样f1对应的就是原来的Form1的实例了,也就可以用这个进行通讯了。但是还是要把不同类之间访问的域和函数定义成public,哎,安全确实是一个问题!!

 

 

 

这个主要是演示数据库操作的数据传递

转载地址:http://wszvi.baihongyu.com/

你可能感兴趣的文章
hdu 3789 hdoj 3789
查看>>
hdu 3788 hdoj 3788
查看>>
zju 1003 zoj 1003
查看>>
zju 1004 zoj 1004
查看>>
zju 1005 zoj 1005
查看>>
zju 1006 zoj 1006
查看>>
【虚拟机】虚拟化架构与系统部署(Windows系统安装)
查看>>
字节跳动安卓开发实习生面试分享
查看>>
好书分享之——《能力陷进》
查看>>
阅读笔记《c++ primer》
查看>>
阅读笔记《C++标准程序库》
查看>>
基于mirror driver的windows屏幕录像
查看>>
C语言8
查看>>
Qt实现简单延时
查看>>
qml有关矩形说明
查看>>
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt中TextField输入框无法输入中文解决办法
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>