`
yangyou230
  • 浏览: 1652995 次
文章分类
社区版块
存档分类

C#中窗体间传递数据的几种方法

 
阅读更多

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

http://blog.donews.com/coolbo/archive/2005/05/29/403132.aspx

一个稍微复杂一点的程序一般都有两个或者更多的窗体。有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,尤其是用子窗体如何改变父窗体。这个问题已经不少人问过,在群里也为了那种方式好而争论过,昨天雨声.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运行结果如下:


http://www.cnblogs.com/crhacker/archive/2005/04/10/134933.html

方法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://blog.csdn.net/eagleeye/archive/2006/06/28/845238.aspx

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

分享到:
评论

相关推荐

    C#窗体间的六种传值方式与ASP.NET的页面传值

    C#窗体间的六种传值方式,通过六过实例,实现了C#窗体间的六种传值方式,三种回传,三种直传,通过属性,构造函数,与事件实现窗体间的传值;还有一个例子是页面间的几种传值方式(c#,.net,asp.net,winFORM)

    winform窗体之间传值的几种方法

    本文介绍了几种窗体之间传值的方式,主要是父窗体和子窗子之间调用数据的传递,内附代码,供初学者参考。

    关于C#参数传递的方法

    关于C#窗体间的数据传值的方法好几种,在项目中都各有应用,虽然简单,这里记录下来,分享给大家!

    C#控件使用编程

    该资源为:C#控件使用与编程资料,如窗体间相互调用及数据传递方法、几种C#窗体间通讯的处理方法 等。

    C#窗体传值代码方法

    假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现。 二、公共属性 我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面...

    C#微软培训资料

    C#语言在.NET 框架中的作用及其特性 1.1 Microsoft.NET 一场新的革命 1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出...

    C#控件大全

    种,设置的方法是在属性窗口中单击Anchor属性右边的箭头,将会 出现如图 9-6 的窗口,通过它可设置 Anchor 属性值。图 9-6 中选中 变黑的方位即为设定的方位控制,即图中所示的为 Left、Right、 Bottom。此时,如果...

    C#编程经验技巧宝典

    74 &lt;br&gt;0107 如何获得字符串中数字或字母的长度 74 &lt;br&gt;0108 如何获得字符串中某个数字的位置 75 &lt;br&gt;0109 获得字符串中汉字的个数 76 &lt;br&gt;0110 获得字符串中指定后几位字符 76 &lt;br&gt;0111 ...

    C# for CSDN 乱七八糟的看不懂

    定义 数组是一种排列有序的数据结构,包含于数组中的变量被称为数组的元素, 它们都有相同的类型。 数组声明 int [] array1 = new int[5]; int [,,] array3 = new int[10,20,30]; int [] array1 = new int[] {1,2,4}...

    ado[1].net中文手册 学习 ado.net的重要资料

    使用 DataAdapter 和 DataSet 更新数据库:描述如何使用 DataAdapter 将对 DataSet 中数据的更改解析回数据源。 向 DataSet 添加现有约束:描述如何从数据源填充 DataSet 的约束(如主键列的唯一约束)。 设置 ...

    net学习笔记及其他代码应用

    6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...

    亮剑.NET深入体验与实战精要2

    5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ...

    亮剑.NET深入体验与实战精要3

    5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ...

    asp.net面试题

    1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( ...

    电子邮件发送程序的设计与实现.doc

    7 4.1窗体界面控件设计 7 4.2 程序实现 8 5、系统的实现与测试 15 5.1 发送电子邮件程序主界面(带附件) 15 5.2接收界面(带附件) 15 6、结束语 17 参考文献 18 电子邮件发送程序的设计与实现 摘 要 电子邮件(简称...

    ASP.NET的网页代码模型及生命周期

    ASP.NET中还提供了控件状态属性作为在服务器往返过程中存储自定义控件中的数据的方法。在页面控件中,如果有多个自定义控件使用多个不同的控件来显示不同的数据结构,为了让这些页面控件能够在在页面上协调的工作,...

    VB课程设计俄罗斯方块

    我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1.可以灵活控制方块在图形框中运动。 2.游戏过程中方块可以自由旋转。 3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以...

Global site tag (gtag.js) - Google Analytics