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中的DeskTop类使用介绍
在Jdk1.6以后新增加了一个类--DeskTop,在JDK中它的解释是这样的: The Desktop class allows a Java application to launch assoc ...
- 常见的js函数
改变元素的样式 var changeStyle = function(elem,name,value){ elem.style[name] = value; } 空位补零 fu ...
- 新浪使用Redis
新浪微博的工程师们曾经在多个公开场合都讲到过,微博平台当前在使用并维护着可能是世界上最大的Redis集群,其中最大的一个业务,单个业务使用了超过 10T 的内存,这里说的就是微博关系服务. 风起 20 ...
- DevExpress控件使用小结 z
.TextEditor(barEditItem)取文本 string editValue = barEditItem1.EditValue.ToString(); //错误,返回null string ...
- (原创)LAMP教程4-用VirtualBox安装64位的centos6.4
(原创)LAMP教程4-用VirtualBox安装64位的centos6.4 好的,今天就要开始正式的讲一些有营养的东西了,是的,没有错就是讲如何用VirtualBox安装64位的centos6.4 ...
- C++实现网格水印之调试笔记(四)—— 完成嵌入
接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下: 输入: 顶点:233 输出: 这又是什么鬼...,我的马呢!!! 看来逻辑上还是有错误 注意这时候 ...
- cocos2d-x 详解之 CCLayer(触摸事件)
CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...
- 五指cms内容浏览量实现方法
实现功能:文章浏览量的统计显示 实现的详细:对文章的总浏览量.当天浏览量.当周浏览量.当月浏览量进行统计 实现代码位置:coreframe/app/content/stat.php 实现的详细代码: ...
- bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...
- PageRank与社交网络模型评估
SNS社交网络在近几年流行起来,并呈现出火爆的增长趋势.在仿制国外Facebook.twitter等成功先例的基础上,国内的人人网.新浪微博等一系列社交网络正风生水起. 这些社交网站表面上看起来十分普 ...