C#窗体间通讯的几种处理方法
应用程序开发中,经常需要多窗体之间进行数据通信,写几个例子,把几种常用的通信方式总结一下:

主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是TextBox,显示选中的该列的文本,另一个是按钮,点击时将修改后的值回传,且在Form1中修改相应的列的文本,同时Form2关闭。
方法一:传值
- publicpartial class Form2 : Form
- {
- private string text;
- private ListBox lb;
- private int index;
- //构造函数接收三个参数:选中行文本,ListBox控件,选中行索引
- public Form2(string text,ListBox lb,int index)
- {
- this.text = text;
- this.lb = lb;
- this.index = index;
- InitializeComponent();
- this.textBox1.Text = text;
- }
- private void btnChange_Click(object sender, EventArgs e)
- {
- string text = this.textBox1.Text;
- this.lb.Items.RemoveAt(index);
- this.lb.Items.Insert(index, text);
- this.Close();
- }
- }
Form1中new窗体2时这么写:
- public partial class Form1 :Form
- {
- int index = 0;
- string text = null;
- public Form1()
- {
- InitializeComponent();
- }
- private void listBox1_SelectedIndexChanged(object sender, EventArgse)
- {
- if (this.listBox1.SelectedItem != null)
- {
- text = this.listBox1.SelectedItem.ToString();
- index = this.listBox1.SelectedIndex;
- //构造Form2同时传递参数
- Form2 form2 = new Form2(text, listBox1, index);
- form2.ShowDialog();
- }
- }
OK,方法一的解决方法就是这样,好处是直观,需要什么就传什么,缺点也是显而易见的,如果窗体1中需要修改的是一百个控件,难道构造的时候还传100个参数进去?况且如果其他窗体仍然需要弹Form2,那Form2就废了,只能供窗体1使用,除非写重载的构造函数,不利于代码的复用,继续看下一个方法。
- //声明Form2继承于Form1
- public partial classForm2 : Form1
- {
- publicint index;
- public ListBox lb;
- public Form2(string text)
- {
- //将继承过来的listBox设置为不可见
- this.listBox1.Visible=false;
- InitializeComponent();
- this.textBox1.Text = text;
- }
- private void btnChange_Click(object sender, EventArgs e)
- {
- string text = this.textBox1.Text;
- this.lb.Items.RemoveAt(index);
- this.lb.Items.Insert(index,text);
- this.Close();
- }
- }
- public partial class Form1 :Form
- {
- public int index = 0;
- public string text = null;
- public Form1()
- {
- InitializeComponent();
- }
- private void listBox1_SelectedIndexChanged(object sender, EventArgse)
- {
- if (this.listBox1.SelectedItem != null)
- {
- text = this.listBox1.SelectedItem.ToString();
- index = this.listBox1.SelectedIndex;
- Form2 form2 = new Form2(text);
- //构造完Form2后,为Form2中各参数赋值
- form2.lb =this.listBox1;
- form2.index = index;
- form2.Show();
- }
- }
- }
- this.lb=base.listBox1;
- this.index=base.index;
OK,第二种写法没问题,可以保存index值,但是对ListBox控件,这么赋值就会出问题,通过测试我发现,base.listBox1指向的,是子类继承过来的listBox1对象,并不是基类自己的listBox1对象。因此我们猜测,那base.index值是不是也是指向子类的index呢?测试一下发现的确是这样,因此this.index=base.index等于没写,去掉照样可以用,因为index一样被Form2继承过来了,因此我们可以了解到,C#中的窗体继承,通过base.控件是无法操作基类控件的。
- //定义一个需要string类型参数的委托
- publicdelegate void MyDelegate(string text);
- public partial class Form2 :Form1
- {
- //定义该委托的事件
- public event MyDelegate MyEvent;
- public Form2(string text)
- {
- InitializeComponent();
- this.textBox1.Text = text;
- }
- private void btnChange_Click(object sender, EventArgs e)
- {
- //触发事件,并将修改后的文本回传
- MyEvent(this.textBox1.Text);
- this.Close();
- }
- }
- public partial class Form1 :Form
- {
- public int index = 0;
- public string text = null;
- public Form1()
- {
- InitializeComponent();
- }
- private void listBox1_SelectedIndexChanged(object sender, EventArgse)
- {
- if (this.listBox1.SelectedItem != null)
- {
- text = this.listBox1.SelectedItem.ToString();
- index = this.listBox1.SelectedIndex;
- Form2 form2 = new Form2(text);
- //注册form2_MyEvent方法的MyEvent事件
- form2.MyEvent += new MyDelegate(form2_MyEvent);
- form2.Show();
- }
- }
- //处理
- void form2_MyEvent(string text)
- {
- this.listBox1.Items.RemoveAt(index);
- this.listBox1.Items.Insert(index, text);
- }
- }
C#窗体间通讯的几种处理方法的更多相关文章
- 总结几种C#窗体间通讯的处理方法
摘要:本文介绍了C#窗体间通讯的几种处理方法,即传值.继承.事件回调,希望对大家有用. http://www.cnblogs.com/jara/p/3439603.html 应用程序开发中,经常需要多 ...
- C#窗体间常用的几种传值方式、以及委托与事件的详细介绍
窗体间的传值,最好使用委托方式传值,开始之前,我们先来说一下委托与事件的关系. 委托:是一个类. 事件:是委托类型的一个特殊实例,只能在类的内部触发执行. 首先创建2个窗体,这里我们以form1为发送 ...
- Linux进程间通讯的几种方式的特点和优缺点,和适用场合
http://blog.csdn.net/jeffcjl/article/details/5523569 由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间 ...
- linux进程间通讯的几种方式的特点和优缺点
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是 ...
- Android线程间通讯的几种方式
1.runOnUiThread(Runnable) 在子线程中直接使用该方法,可以更新UI runOnUiThread(new Runnable(){//更新UI ...
- C#进程间通讯或同步的框架引荐
这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下 0.背景简介 微软在 .NET 框架中提供了多种实用 ...
- C# winform窗体间传值(使用委托或事件)
窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...
- C#利用事件与委托进行窗体间传值简单小例子
本篇博客是利用C#委托与事件进行窗体间传值的简单小例子 委托与事件的详细解释大家可以参照张子阳的博客: http://www.tracefact.net/CSharp-Programming/Dele ...
- C#窗体间传值的简便方法/工具
一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...
随机推荐
- Java Error和Exception区别
Error和Exception都继承自Throwable: 二者不同之处: Exception: 1.可以是可被控制(checked)或者不可控制(unchecked): 2.表示一个由程序员导致的错 ...
- Hadoop集群中Hbase的介绍、安装、使用
导读 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. 一.Hbase ...
- cocos2d anchor point 锚点解析
anchor point 究竟是怎么回事? 之所以造成不容易理解的是因为我们平时看待一个图片是 以图片的中心点 这一个维度来决定图片的位置的.而在cocos2d中决定一个 图片的位置是由两个维度 一个 ...
- 提高Web页面性能的技巧
现在动辄几兆大小的页面加载量,让性能优化成了不可避免的热门话题.WEB 应用越流畅,用户体验就会越好,继而带来更多的访问量.这也就是说,我们应该反省一下那些过度美化的 CSS3 动画和多重操作的 DO ...
- CSS垂直水平完全居中手册
水平居中 内联元素(inline or inline-*)居中? 你可以让他相对父级块级元素居中对齐 .center-children { text-align: center; } 块级元素(blo ...
- SOA和NS区别
SOA是起始权威服务器,在该服务器上可以新增和删除记录; NS服务器是笔试哪些DNS服务器可以解析该域名; 对于一个域(如baidu.com)SOA只有一个NS可以有多个. NS服务器包含SOA,SO ...
- 关于ShareSDK接入的各种问题,以及解决方案
随着社交网络的流行,游戏接入分享已经是必然.毕竟这是非常好的一种推广方式.ShareSDK是一个非常好的内分享提供商!但是接入后发生的各种问题,下面给大家提供几个本人遇到的问题,以及解决方法: 1)微 ...
- 用Windows Live Writer发来
文字 package com.myeclipseide.example.myblog.secure; import com.opensymphony.xwork2.ActionSupport; ...
- The First Pig Task
The First Pig Program 环境: Hadoop-1.1.2 pig-0.11.1 linux系统为CentOS6.4 jdk1.6 在伪分布 ...
- Apache Spark GraphX的使用简介
类似 Spark 在 RDD 上提供了一组基本操作符(如 map, f ilter, reduce), GraphX 同样也有针对 Graph 的基本操作符,用户可以在这些操作符传入自定义函数和通过修 ...