1.窗体间数据传输

主窗体连续不断更新给子窗体  本文章来源于网络 年代久远 如有侵犯 请联系删除

1.通过

在windows form之间传值,我总结了有四个方法:全局变量、属性、窗体构造函数和delegate。

第一个全局变量:

这个最简单,只要把变量描述成static就可以了,在form2中直接引用form1的变量,代码如下:

在form1中定义一个static变量public static int i= 9 ;

  1 Form2中的钮扣按钮如下:
2
3 private void button1_Click(object sender, System.EventArgs e)
4
5 {
6
7 textBox1.Text = Form1.i.ToString();
8
9 }
10

第二个方法:

这也许是个老话题了,但是今天我在用property 时却有了新的发现。那就是如果传递的是类的话,那么是按地址(引用)来传递的。例如如下两个程序。假设有两个form,form1、form2和一个Class1.cs的类文件。form1是程序的开始窗体,通过form1 来调用form2 。程序如下:

  1 Class1.cs文件的内容是
2
3 public class Class1
4
5 {
6
7 public int i;
8
9 public Class1()
10
11 {
12
13 //
14
15 // TODO:
16
17 i = 9;
18
19 }
20
21 public void modify( int u )
22
23 {
24
25 i = u;
26
27 }
28
29 }
30
  1 Form1中的内容是
2
3 private Class1 ttt;
4
5 private void Form1_Load(object sender, System.EventArgs e)
6
7 {
8
9 ttt = new Class1();
10
11 Form2 temp = new Form2();
12
13 temp.Change = ttt;
14
15 temp.Show();
16
17 }
18
19 private void button1_Click(object sender, System.EventArgs e)
20
21 {
22
23 textBox1.Text = ttt.i.ToString();
24
25 }
26
27 private void button2_Click(object sender, System.EventArgs e)
28
29 {
30
31 ttt.modify( 44);
32
33 }
34
  1 form2中的内容是:
2
3 private Class1 change;
4
5 public Class1 Change
6
7 {
8
9 get { return change ;}
10
11 set
12
13 {
14
15 change= value;
16
17 }
18
19 }
20
21 private void button1_Click(object sender, System.EventArgs e)
22
23 {
24
25 textBox1.Text = change.i.ToString();
26
27 }
28
29 private void button2_Click(object sender, System.EventArgs e)
30
31 {
32
33 change.modify( 98 );
34
35 }
36

运行程序你会发现,改form1 中的textbox值,那么form2 中change中的i 的值也会相应的变,同样form2中change的 i 值变了,那么form1 中的 ttt 中的 i 也相应的变了。就好像两个form在使用同一个数据变量一样,为什么呢?

经过思考,其实很简单,原因就在于我们在使用property传递数据时使用了同一块内存空间。

在传递class类型的数据时(如上),由于我们没有new一个新的实例,而是直接赋值,所以就相当于使用了引用,把上面的赋值过程改成下面这样,

private Class1 change;

  1    public Class1 Change
2
3 {
4
5 get { return change ;}
6
7 set
8
9 {
10
11 change = new Class1();
12
13 change.i = value.i ;
14
15 }
16
17 }
18

那么两个form中的值相互之间就不再有什么关联了,也就是说,改其中一个,不会影响另外一个。这也给了我们一个启示,当我们想在form之间传值时,而且还想让值之间有一定的联系,那么就把这些值用class来包起来,再传。这样又清楚又省事。

如果你传的不是类而是一般数据(int , string )等,那么这些数据在form之间是没有联系的,因为C#在定义这些数据类型时,就默认new了他们,例如:int i ; 和int i = new int() ; 是一样的,所以我以前经常在form之间传递简单的变量时,没有发现数据之间的关系,直到今天传 class 时才发现。像下面这样的 class :

  1 class temp
2
3 {
4
5 int i ;
6
7 int[] mm;
8
9 public temp ()
10
11 { mm = new int [10] ; }
12
13 }
14

在form之间传递时,变量 i 是两个窗体共用的,但是mm 却不是,其原因就是我上面讲的那样,所以利用property的这个特性,我们可以灵活的在form之间传递我们想变和不想变的值。

第三个方法是用构造函数:

  1 Form1 的button按钮这样写:
2
3 private void button1_Click(object sender, System.EventArgs e)
4
5 {
6
7 Form2 temp = new Form2( 9 );
8
9 temp.Show();
10
11 }
12
13 Form2 的构造函数这样写:
14
15 public Form2( int i )
16
17 {
18
19 InitializeComponent();
20
21 textBox1.Text = i.ToString();
22
23 }
24

第四个方法是用delegate,代码如下:

  1 Form2中先定义一个delegate
2
3 public delegate void returnvalue( int i );
4
5 public returnvalue ReturnValue;
6
7 form2 中的button按钮代码如下:
8
9 private void button1_Click(object sender, System.EventArgs e)
10
11 {
12
13 if ( ReturnValue != null )
14
15 ReturnValue( 8 );
16
17 }
18
19 Form1中的button按键如下:
20
21 private void button1_Click(object sender, System.EventArgs e)
22
23 {
24
25 Form2 temp = new Form2( );
26
27 temp.ReturnValue = new temp.Form2.returnvalue( showvalue );
28
29 temp.Show();
30
31 }
32
33 private void showvalue( int i )
34
35 {
36
37 textBox1.Text = i.ToString();
38
39 }
40

c# 主窗体更新子窗体 进程间通信的更多相关文章

  1. 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序

    主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...

  2. 2016.6.18主窗体、子窗体InitializeComponent()事件、Load事件发生顺序以及SeleChanged事件的发生

    主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序 1.主窗体定义事件 new 主窗体() 构造函数进入主窗体InitializeComponent函数,该函数中 ...

  3. C#之菜单控件、主窗体打开子窗体、GroupBox控件使用

    一.背景 一年前有学习过C#,但没有在项目中去实际做APP,重新捡起来应用到项目中.我同事本来做好一个CANOPEN设备管理的界面,由于近期搜索了别人的开发的界面,我觉得有很多东西要重新安排,以及我已 ...

  4. Caliburn.Micro 关闭父窗体打开子窗体

    比如我们在做登录的时候需要关闭父窗体打开子窗体.使用Caliburn.Micro它的时候我们关闭登录窗口的时候主页面也会关闭. 解决方法就是在登录页面的CS里面写 IndexView iv = new ...

  5. C# 关闭子窗体释放子窗体对象问题

    1 在主窗口中实例化子窗口 Form2 f2 = new Form2(); 2 通过按钮来显示子窗口 f2.Show(); 3 关闭子窗口而不释放子窗口对象的方法 protected override ...

  6. 附实例!实现iframe父窗体与子窗体的通信

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...

  7. C#_父窗体跟子窗体的控件操作

    很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...

  8. winform里操作打开在panel里的form窗体,子窗体操作同级子窗体或者父窗体的方法

    最近开始了一个winform项目,原先一直都是web项目.遇到个问题,就是在框架内,左侧和中间的main都是用panel来实现的form,就是把form窗体打开到panel里,实现左侧是导航,中间是操 ...

  9. delphi 判断MDI窗体的子窗体是否存在

    //***************************************************************************//函 数名: CreateForm //返 ...

随机推荐

  1. 【Android】详解Android Activity

    目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...

  2. Presto 架构和原理简介(转)

    Presto 是 Facebook 推出的一个基于Java开发的大数据分布式 SQL 查询引擎,可对从数 G 到数 P 的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别,据称该引擎的性能是 ...

  3. 数据源从druid迁移到HikariCP

    最近正好在做新项目,使用的是druid数据源,也真是巧,有朋友建议我使用HikariCP这个数据源,可以说是牛的一笔,速度快的飞起,性能极高! 要比druid不知道好多少倍,druid其实在某些情况下 ...

  4. MUI中等待框的H5实现

    MUI没有内置的那个弹出转圈圈的那个等待框,那个nativeui.showwaiting是只能用于app中的,不能用在H5网页中的,网上找了下,找到个别人已经写好的,自己 测试了下没问题,先记下来 @ ...

  5. 【iCore1S 双核心板_ARM】例程七:通用定时器实验——定时点亮LED

    实验原理: 通过STM32的三个GPIO口来驱动LED灯的三个通道:设定GPIO为推挽 输出模式,采用灌电流的方式与LED连接,输出高电平LED灭,输出低电平 LED亮,通过通用定时器TIM3实现50 ...

  6. YouTube上最火的十个大数据视频

    http://blog.jobbole.com/84148/ YouTube上最火的十个大数据视频

  7. BitSet的用法

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数 ...

  8. Windows 使用 Gogs 搭建 Git 服务器

    随便说两句 之前有使用 Gitblit 在Windows搭建Git服务器,用的也挺好的,可能安装起来略麻烦一点.现在全用 Gogs 在windows搭建Git服务器,主要是因界面好看,管理更方便一些. ...

  9. 80x86的保护模式

    什么是保护模式? 通过对程序使用的存储区采用分段.分页的存储管理机制, 达到分组使用.互不干扰的保护目的.能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换. 所以,内存地址由段基地址.偏移 ...

  10. 将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种方式

    Tomcat作为Servlet/JSP容器(服务器)挺不错的,开源免费,需要知道的是Tomcat是一个Web服务器,其符合Servlet/JSP规范,但是却没有实现所有JavaEE规范,所以我们还是应 ...