Winform的窗体之间的数据传递是开发的必备技术,下面介绍几种典型的传值方法

1、构造函数传值,但这种方法是单向的(推荐)

上代码,先传值

 private void button2_Click(object sender, EventArgs e)
{
Form3 fr3 = new Form3("要传的值啊");
fr3.ShowDialog();
}

接值,对了,这里需要重载一个Form3的构造函数,然后将拿到的值显示出来

 public Form3(string canshu)
{
InitializeComponent();
label1.Text = canshu;
}

效果图,就是这么简单

2、静态变量传值(不推荐)

可以将静态变量申明在你需要的地方,比如一个单独类,或者Form中,比如我们在这里申明在Form2中

 public static string xvalue;
 private void button2_Click(object sender, EventArgs e)
{
xvalue = "要传的值啊xvalue";
Form3 fr3 = new Form3();
fr3.ShowDialog();
}

先给赋值,然后在Form3中取值

 public Form3()
{
InitializeComponent();
label1.Text = Form2.xvalue;//Form2实际也是个class,直接取静态值即可,如果静态变量xvalue定义在其他类中,即将Form2替换即可
}

效果图上

3、通过共有属性传值

首先在要打开的Form中创建一个共有属性,然后在调用窗口赋值即可。比如下面Form2启动Form3,即给Form3的yvalue传值

(1)在Form3中定义共有属性

 public string yvalue {
get
{
return label1.Text.ToString();
}
set
{
label1.Text = value;
}
}

(2)Form2中启动Form3,并传值

 private void button2_Click(object sender, EventArgs e)
{
Form3 fr3 = new Form3();
fr3.yvalue = "要传的值啊";
fr3.ShowDialog();
}

4、通过Owner属性传值

(1)在调用者Form2中申明一个公有变量,并赋值,设置需要启动的Form3的Owner

 public string xvalue;
private void button2_Click(object sender, EventArgs e)
{
xvalue = "Form2要传的值";
Form3 fr3 = new Form3();
fr3.Owner = this;
fr3.ShowDialog();
}

(2)启动窗体Form3中取值

 private void Form3_Load(object sender, EventArgs e)
{
Form2 fr2 = (Form2)this.Owner;
label1.Text = fr2.xvalue;
}

这种方法实际是将Form2传给了Form3,因此Form3可以取到Form2的所有公有变量和属性。

5、委托传值(推荐)

委托传值主要用在子窗体给父窗体传值上,即上文的Form3给Form2传值

(1)先在Form3中申明委托

 public delegate void PutHandler(string text);
public PutHandler putTextHandler;//委托对象
private void button1_Click(object sender, EventArgs e)
{
if (putTextHandler != null)
{
putTextHandler(textBox1.Text.ToString());
}
}

(2)在Form2中绑定委托事件

 public void getValue(string strV)
{
this.textBox1.Text = strV;
} private void button1_Click(object sender, EventArgs e)
{
Form3 fr3 = new Form3();
fr3.putTextHandler = getValue;
fr3.ShowDialog();
}

注意:

委托和事件是不一样的,你最后一个示例。
if (putTextHandler != null)
{
putTextHandler(textBox1.Text.ToString());
}
上面这样做是有bug的。
最好的做法是,是先用临时变量缓存putTextHandler ;
然后在处理,
否则你判断!=null成立
但是马上在其他地方-=的话,程序就出错了
-=你是不知道会由谁调用的

Winform开发之窗体传值的更多相关文章

  1. C# WinForm开发 取消窗体关闭按钮

    //禁用窗体的关闭按钮 private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParam ...

  2. Winform开发之窗体显示、关闭与资源释放

    Winform的窗体涉及到一般窗体(单文档窗体).MDI窗体.窗体之间的关系等,那么如果调用打开新窗体.如何关闭窗体.窗体资源的释放等都关系到软件运行的效率,本文一一介绍 1.窗体的显示 从一个窗体打 ...

  3. C# Winform中的窗体传值

    关于C#winform窗体之间的传值有以下几种做法 1 通过构造函数传值 2 属性传值 以上两种方法不早详细介绍. 3 通过事件传值,委托传值 首先看一下通过委托传值吧. 1,创建两个窗体,分别是Fo ...

  4. Winform开发入门集中培训系列文章

    最近有个培训,写PPT不如写博客了,共享是程序猿的职业情操吧,因此,本人准备写一个Winform开发的系列文章,对于初级开发者来说,应该比较有用,写作当中不免错误或不成熟的地方,看到的朋友请留言指出, ...

  5. WinForm开发,窗体显示和窗体传值相关知识总结

    主窗体中代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...

  6. .NET开发之窗体间的传值转化操作

    DOTNET开发之窗体间的传值转化操作 好想把自己最近学到的知识写下来和各位朋友分享,也希望得到大神的指点.今天终于知道自己要写点什么,就是关于WPF开发时简单的界面传值与简单操作. 涉及两个界面:一 ...

  7. winform两个窗体之间传值(C#委托事件实现)

    委托 定义一个委托,声明一个委托变量,然后让变量去做方法应该做的事. 委托是一个类型 事件是委托变量实现的 经典例子:两个winform窗体传值 定义两个窗体:form1和form2 form1上有一 ...

  8. C# WinForm 父窗体 子窗体 传值

    C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值= ...

  9. C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...

随机推荐

  1. AngularJs练习Demo9 Http

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  2. MD5 Tool 工具类

    package com.example.secret.tools; import java.io.UnsupportedEncodingException; import java.security. ...

  3. Python爬虫——抓取糗百段子

    在别人博客里学习的 抓取糗百段子,由于糗百不断的更新,代码需要改正. 抓取网页:http://www.qiushibaike.com/hot/page/1 修改后的代码如下: # -*- coding ...

  4. CODEVS 2451 互不侵犯

    2451 互不侵犯 题目描述 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格 ...

  5. 洛谷 P1896 互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  6. javascript-几个基础的排序算法

    对这几个基础排序算法进行梳理,便于以后查看. /** * * 冒泡排序 * 从末尾开始相邻两数相互比较大小,满足条件就交换位置.循环每进行一次,即可确定第i位数的值. *冒泡排序的时间复杂度为O(n^ ...

  7. Python基础第四天

    必须掌握的内置函数 bytes() divmod() eval() exec() isinstance() range() 常用函数 1.数学相关 abs(x) abs()返回一个数字的绝对值.如果给 ...

  8. Python学习笔记捌——面向对象高级编程

    __slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__s ...

  9. Keil C动态内存管理机制分析及改进

    Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mempool.mallloe和free这3个Ke ...

  10. CSS3 新特性 开放字体格式WOFF

    疑问 上面这是虾米玩意?    \e806 是在自定义字体表中的字体位置.    好嘛 现在问题来了 WOFF里面是什么东西呢? 怎么才能看到? 用这个:FontCreatorPortable     ...