创建一个Winform窗体应用程序项目,然后添加一个Form2窗体。

在Form1和Form2中各添加一个textBox和button:

单击Form1中的button1,弹出Form2,然后要做的就是在Form1中的textBox1和Form2中的textBox2中传值。

为了方便起见,将Form1称作父窗体,将Form2称作子窗体

相对来说,将父窗体的值传到子窗体较为容易实现。下面分别进行说明。

一、父窗体传值给子窗体。

方法1:通过Form类构造方法的重载传参。

Form1类中代码:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(textBox1.Text);
f2.ShowDialog();
}
}
}

Form2类中代码:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public Form2(string str)
{
InitializeComponent();
textBox2.Text = str;//这句必须放在InitializeComponent();的后面,否则会引起“空引用异常”
}

}
}

方法2:通过外部可访问的中间变量传参。

先看一串无法实现目的的代码。

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} public string str;//public类型的实例字段 private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
str = textBox1.Text;//注意,这句不能放在f2.ShowDialog();的后面,否则会先执行textBox2.Text = f1.str;再执行str = textBox1.Text;
f2.ShowDialog();
}
}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void Form2_Load(object sender, EventArgs e)
{
Form1 f1 = new Form1();
textBox2.Text = f1.str;
} }
}

结果值没有传过来:

这是因为:Form1 f1 = new Form1();相当于新建了一个对象,这个新对象的str初始值是null(只有该对象的button1被click的时候才会改变str的值)。textBox2.Text = f1.str;其实就是将null赋给了textBox2.Text。

调试如图:

static变量可以认为是全局变量,static变量被所有对象所共有,也可以被所有对象所改变,将相关代码修改如下即可:

public static string str;//public类型的实例字段

private void Form2_Load(object sender, EventArgs e)
{
textBox2.Text = Form1.str;
}

它有一种变式:

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.str = textBox1.Text;
f2.ShowDialog(); }
}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public string str;//这里str是在Form2类中定义的,并且不需要static关键字 private void Form2_Load(object sender, EventArgs e)
{
textBox2.Text = str;
} }
}

分析: f2.str = textBox1.Text;将textBox1的值赋给f2.str,由于f2.ShowDialog();跳出来的刚好是这个对象,因此这个对象的str值不为空。最终通过textBox2.Text = str;将值传过去了。跟上一个例子的不同之处是:str声明的位置不一样,一个是在Form1类中,一个是在Form2类中。

一、子窗体传值给父窗体。

方法1:通过Owner设置窗口归属来传值。

① 通过Controls

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog(this);//这个this必不可少(将窗体显示为具有指定所有者:窗体f2的所有者是Form1类当前的对象)
}
}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
Form1 f1 = (Form1) this.Owner;//将本窗体的拥有者强制设为Form1类的实例f1
f1.Controls["textBox1"].Text = textBox2.Text;
} }
}

② 通过在控件所在类中增加改变控件属性的方法

或者通过在Form1中添加一个ChangeText方法也行:

public void ChangeText(string str)
{
textBox1.Text = str;
}

Form2中代码相应改变为:

private void button2_Click(object sender, EventArgs e)
{
Form1 f1 = (Form1) this.Owner;//将本窗体的拥有者强制设为Form1类的实例f1
f1.ChangeText(textBox2.Text);
}

注意:如果不用Owner,仅仅想用下面的代码实现,是没可能的。

//Form1中:
using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
} public void ChangeText(string str)
{
textBox1.Text = str;
}
}
} //Form2中:
using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
Form1 f1 =new Form1();
f1.ChangeText(textBox2.Text);
} }
} //这种代码无法实现目的

③ 通过将外界不可访问的控件“属性”封装成可以访问的属性。

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog(this);
} public string TextBox1Value
{
set { textBox1.Text = value; }
get { return textBox1.Text; }
}

}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
Form1 f1 =(Form1)this.Owner;
f1.TextBox1Value = textBox2.Text;
} }
}

方法2:通过提供外部可访问的属性和DialogResult的状态来传值(这个例子同时实现了父传子、子传父)。

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.TextBox2Value = textBox1.Text;//顺便把父窗体的值先传给子窗体 //这一行不需要再写f2.ShowDialog();或者f2.Show();,否则f2会弹出来两次 if (f2.ShowDialog() == DialogResult.OK)//这样的语句是合法的:DialogResult f = f2.ShowDialog();
{
textBox1.Text = f2.TextBox2Value;
//f2.Close();//这一句写或者不写,f2都会关闭
}
}
}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public string TextBox2Value //将外部不可访问的textBox2.Text封装成属性TextBox1Value
{
set { textBox2.Text = value; }
get { return textBox2.Text; }
} private void button2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;//这里的DialogResult是Form2类对象的属性
} }
}

方法3:通过委托事件来传值。(这种方式可以实现不同控件数据实时联动的复杂功能)

Form1中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ChangeText += new ChangeTextHandler(Change_Text);//将事件和处理方法绑在一起,这句话必须放在f2.ShowDialog();前面
f2.ShowDialog();
} public void Change_Text(string str)
{
textBox1.Text = str;
}
}
}

Form2中:

 using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public delegate void ChangeTextHandler(string str); //定义委托 public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public event ChangeTextHandler ChangeText; //定义事件 private void button2_Click(object sender, EventArgs e)
{
if (ChangeText != null)//判断事件是否为空
{
ChangeText(textBox2.Text);//执行委托实例
this.Close();
}
}
}
}

可以用.NET提供的Action<>泛型委托和lambda表达式简化上面这个例子:

 //Form1中:
using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ChangeText = (str) => textBox1.Text = str;//用lambda表达式实现,这句话必须放在f2.ShowDialog();前面
f2.ShowDialog();
}
}
} //Form2中:
using System;
using System.Windows.Forms; namespace WindowsForms跨窗体传值大全
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
} public Action<string> ChangeText;//之前的定义委托和定义事件由这一句话代替 private void button2_Click(object sender, EventArgs e)
{
if (ChangeText != null)//判断事件是否为空
{
ChangeText(textBox2.Text);//执行委托实例
this.Close();
}
}
}
}

参考资料:

http://blog.csdn.net/yuekunge/article/details/9171301

http://www.jb51.net/article/63837.htm

http://jingyan.baidu.com/article/84b4f565d03bf360f6da3213.html

C#跨窗体传值的几种方法分析(很详细)的更多相关文章

  1. ionic 跨页面传值的几种方法

    1.使用AngularJS自带的$cacheFactory服务 $cacheFactory 从字面直译即为缓存工厂,可以用它来生成缓存对象,缓存对象以key-value的方式进行数据的存储,在整个应用 ...

  2. 【页面传值6种方式】- 【JSP 页面传值方法总结:4种】 - 【跨页面传值的几种简单方式3种】

    阅读目录 1. URL 链接后追加参数 2. Form 3. 设置 Cookie 4. 设置 Session JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总 ...

  3. MVC控制器向View视图传值的三种方法

    首先创建一个MVC的项目,其中需要一个控制器(TestController),三个视图(index,edit,detail) 1.项目结构如下:

  4. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  5. React Router v4 页面传值的三种方法

    传值方法 1.props.params 使用React router定义路由时,我们可以给指定一个path,然后指定通配符可以携带参数到指定的path: <Route path='/user/: ...

  6. 解决ajax跨域问题的一种方法

    解决ajax跨域问题的一种方法 前后端分离经常用json来传输数据,比较常见的问题就有ajax跨域请求的错误问题,这里是我的一种解决方法: 在java中加入如下的注解类: import org.spr ...

  7. C#跨窗体传值

    果然C#的跨窗体传值比vb难得多,vb就定义一个全局变量就ok,但是C#还要考虑到命名空间的问题 frmMain要调用LoginUI的两个值,但是在此同时,frmMain又要引用LoginUI,所以说 ...

  8. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  9. LwIP协议栈开发嵌入式网络的三种方法分析

    LwIP协议栈开发嵌入式网络的三种方法分析   摘要  轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中.本文结合μC/OS-II这一实时操作系统,以 ...

随机推荐

  1. spotlight工具监控oracle

    spotlight工具版本Version: 5.0.1.1022 安装步骤 安装完成 安装之后,桌面上会生成如下图标 双机此图标,输入License 输入激活码 点击close,再次查看 建立连接,监 ...

  2. C# 调用打印机 打印 Excel

    打印 Excel 模板 大体思路,通过NPOI操作Excel文件,通过Spire将Excel转成图片,将图片传给系统打印. Spire是收费工具,在微软库中下载Free版本. #region 打印所用 ...

  3. 迷宫问题bfs, A Knight's Journey(dfs)

    迷宫问题(bfs) POJ - 3984   #include <iostream> #include <queue> #include <stack> #incl ...

  4. Python3 字典 setdefault() 方法

    Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值. dict.setdefault(key, default=None) k ...

  5. ionic3安卓平台引用高德地图

    1.前置条件 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 2.打开src目录下的index.html, 在head标签中添加以下代码,引入js: <script ty ...

  6. vue源码核心部分

    1.模板编译   初始化时做的:template ==parse()==>ASTtree ==generate()==>render函数  ==> mount(调用dom方法) 每次 ...

  7. Hive环境的安装

    hive是什么:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能(HQL) hive有什么用 1.通过类SQL语句快速实现简单的Map ...

  8. element-vue-koa2-mysql实现文件上传

    友情提示:这篇博客不会详细说明搭建过程 阅读群体建议:第一次使用node或者koa2写文件上传或者下载,因为你不知道用fs的哪个方法,我也是从fs里试水试了一天,各种百度才搞出来的,特别学过java的 ...

  9. oracle入坑日记<一> 安装

    学习日记系列(前辈/大神勿喷) 一.下载 下载地址:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads ...

  10. 拼接html

    var html='<tbody>\ <tr class="print-tr-top">\ <td width="50%" col ...