您的位置:首页 > 编程语言 > C#

C#窗口间传递消息

2014-12-04 13:36 148 查看
http://blog.csdn.net/chenyuling/archive/2007/05/25/1625907.aspx
我用的方法是:见下面我在白云的帖子
发信人:CCBB(超超饱饱|酒饱饭足~~),信区:DotNet
标题:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月04日22:03:00星期三)

一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话框窗
口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入文件
中。
问题是:当点击保存按钮后,如何告知MainForm这个消息呢,我想要点击保存后就能在Mi
anForm上显示修改后的信息。
本来想在MainForm中设一个static变量,点击保存按钮把消息传给这个变量,但是点击之
后又如何立刻知道这个变量被修改了呢?

--

Youarebeautiful,Youarebeautiful,it'strue.

Butit'stimetofacethetruth...Iwillneverbewithyou...

  ╭———╮

※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:joshuaG(BigG|Solution,Revolution,Evolution),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月04日22:11:13星期三),站内信件

例如说你要把对话框里的一个TextBox的文本保存在MainForm里头,这样

假设这个TextBox是_tb

在DialogForm中定义一个Property:

publicstringData{get{return_tb.Text;}}

同时把保存按钮的DialogResult属性设置为OK

然后在MainForm的打开对话框的方法中写

DialogFormfrm=newDialogForm();
if(frm.ShowDialog()==DialogResult.OK)
val=frm.Data;

其中val是你要赋值的变量

【在CCBB(超超饱饱|酒饱饭足~~)的大作中提到:】
:一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话框窗
:口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入文件
:中。
:问题是:当点击保存按钮后,如何告知MainForm这个消息呢,我想要点击保存后就能在Mi
:anForm上显示修改后的信息。
:本来想在MainForm中设一个static变量,点击保存按钮把消息传给这个变量,但是点击之
:后又如何立刻知道这个变量被修改了呢?

--
有四类人
积极采取行动促使事件发生的人
被动接受所发生事件的人
对事件持旁观者心态的人
什么事也不关心的人
而我要做的当然是第一种人,能做出变革和业绩的人
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:CCBB(超超饱饱|酒饱饭足~~),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月04日22:27:08星期三)

明白了,用个DialogResult属性...多谢~!!
【在joshuaG的大作中提到:】
:例如说你要把对话框里的一个TextBox的文本保存在MainForm里头,这样
:假设这个TextBox是_tb
:在DialogForm中定义一个Property:
--
Youarebeautiful,Youarebeautiful,it'strue.
  ╭———╮
  │╯╰ │
  │口 ├┬—╮
  ╰——┬╯│╭╯
  ╯ ╯╰—

※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:hustorochi(MarkZhou),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月09日20:48:08星期一)

请使用事件解决此问题。

首先需要在Dialogform中声明如下事件和函数。

publiceventEventHandlerSavedData;

protectedvirtualvoidOnSavedData(EventArgse)
{
if(this.SavedData!=null)
{
this.SavedData(e);
}
}

然后在"保存"按钮处理事件中引发该事件。

privatevoidOnSaveButtonClick(objectsender,EventArgse)
{
//TODO:Saveyourdata.
WriteDataToFile();
OnSavedData(newEventArgs());
}

最后在MainForm打开对话框的时候。

publicvoidOnOpenDialogMenuItemClick(objectsender,EventArgse)
{
DialogFormform=newDialogForm();
//SubscribetheSavedDataevent.
form.SavedData+=(_sender,_e)=>RefreshData();
form.ShowDialog();
}

请尽量减少使用通过ShowDialog()的返回值DialogResult判断商业逻辑。这样会导致
无法维护的代码增加。

【在CCBB的大作中提到:】
:一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话..
:口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入..
:中。

--
MarkZhou
SoftwareDesignEngineer(SDE)
SolutionDeliveryEngineeratMicrosoft
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:joshuaG(G|我们如何才能更加了解彼此呢?),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月09日22:28:41星期一),站内信件

学习了
【在hustorochi(MarkZhou)的大作中提到:】
:
:请使用事件解决此问题。
:
:首先需要在Dialogform中声明如下事件和函数。
:
:publiceventEventHandlerSavedData;
:
--



ILoveRock&Roll



ILoveArt&War
http://newhost.byhh.net/f/DotNet/1161499057/eyes.jpg
ILoveUAfterAll
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:doubleclick(强悍地解释人生),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月09日23:38:16星期一),站内信件

融哥能否谈谈"请尽量减少使用通过ShowDialog()的返回值DialogResult判断商业逻
辑。这样会导致
无法维护的代码增加。"这具体是如何引起的?另外就楼主这个问题,这里为什么不用for
m2的构造器直接传参数进去?

谢谢

【在hustorochi(MarkZhou)的大作中提到:】:
:请使用事件解决此问题。
:
:首先需要在Dialogform中声明如下事件和函数。
:
:publiceventEventHandlerSavedData;
:
:protectedvirtualvoidOnSavedData(EventArgse)
:{
:if(this.SavedData!=null)
:.................(以下省略)

--
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·[FROM:fox23.cnblogs.com


发信人:yuxhust(happyfish),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月10日16:33:37星期二)

按LZ的需求,也可以用MDIParent窗体
【在CCBB的大作中提到:】
:一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话..
:口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入..
:中。
:问题是:当点击保存按钮后,如何告知MainForm这个消息呢,我想要点击保存后就能..

--
http://newhost.byhh.net/f/Picture/1234163724/2009_2_9_151323.bmp
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:joshuaG(G|想念变成一条线在时间里面蔓延),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月10日16:34:20星期二),站内信件

MDI是用于多文档的,用在这种Dialog上面显然不合适。

【在yuxhust(happyfish)的大作中提到:】
:按LZ的需求,也可以用MDIParent窗体
:【在CCBB的大作中提到:】
::一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话..
::口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入..
::中。
::问题是:当点击保存按钮后,如何告知MainForm这个消息呢,我想要点击保存后就能..

--
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·[FROM:UtopianBlue]


发信人:yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日00:32:29星期三),站内信件

~这个非常好
可以算是一个利用事件的最佳实践吧
事件或者观察者模式在这里产生的松耦合是非常有意义的

【在hustorochi(MarkZhou)的大作中提到:】
:
:请使用事件解决此问题。
:
:首先需要在Dialogform中声明如下事件和函数。
:
:publiceventEventHandlerSavedData;
:

--

上善若水
水利万物而不争
Helloyou,Hellome,HelloWorld...
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日00:39:30星期三),站内信件

DialogResult也就用CommonDialog时候好用

自己定义的DialogForm形式多样,DialogResult并不是一个必须的东西,不是规范

所以完全没有办法保证自定义的DialogForm会返回这么个对象

换句话说

如果在主程序里面试用了DialogResult,那么主程序就对DialogForm有了依赖,依赖来
自于DialogResult

lz的问题看情况

我觉得如果是利用一个DialogForm修改一个全局的值,设置主窗体的static变量或者使
用单例模式存储全局变量就可以了

如果是需要对局部变量在DialogForm中进行计算处理等工作,返回处理的值,完全可以
用构造器参数,但是无论何种方法都没有提供值改变通知功能

因此需要添加一个SavedData事件来反向通知调用者值的变化,主程序可以通过订阅事件
刷新数据,这也就是上面程序解决的问题

【在doubleclick(强悍地解释人生)的大作中提到:】
:融哥能否谈谈"请尽量减少使用通过ShowDialog()的返回值DialogResult判断商业逻
:辑。这样会导致
:无法维护的代码增加。"这具体是如何引起的?另外就楼主这个问题,这里为什么不用for
:m2的构造器直接传参数进去?
:谢谢

--

上善若水
水利万物而不争
Helloyou,Hellome,HelloWorld...
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:hustorochi(MarkZhou),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日12:57:17星期三)

我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于DialogResult,它依赖于
ModalDialog,如果程序显示的是一个ModalessDialog,那么DialogResult不产生任
何值,从而UI的改变导致了代码的改变。

另一方面,我也不推荐通过构造函数对UI组件传递数据。构造函数是用来对其所描述的
类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。
利用构造函数把一个数据传进来,而该数据跟这个类(System.Windows.Forms.Form)没有直
接关系,那么这就是DataCorruption。

所以,这里最好的设计模式就是Subscribe->Observer。

【在yayxcn的大作中提到:】
:DialogResult也就用CommonDialog时候好用
:自己定义的DialogForm形式多样,DialogResult并不是一个必须的东西,不是规范
:所以完全没有办法保证自定义的DialogForm会返回这么个对象
:换句话说
:如果在主程序里面试用了DialogResult,那么主程序就对DialogForm有了依赖,依赖..
:自于DialogResult
:lz的问题看情况

--
MarkZhou
SoftwareDesignEngineer(SDE)
SolutionDeliveryEngineeratMicrosoft
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:wpboy(我爱抬杠,但我更爱真理),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日13:05:32星期三),站内信件

我以前写代码很有洁癖,觉得就应该用正确的优雅的方法。
然后偶然发现好比“单身宿舍”,如果不考虑以后扩展为
两人世界三口之家的,为啥搞这么干净,人活得多累啊。
很多人写的小程序可能也就他自己用用,别人都不会去维
护的,更不会去扩展,所以能以最简单的方法搞定即可。
有时太多的模式啊框架啊,对于我们这种入门级的,还是
很有难度的。是吧,加菲~~敲这么多字不容易

【在hustorochi(MarkZhou)的大作中提到:】
:
:我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于DialogResult,它依赖于
:ModalDialog,如果程序显示的是一个ModalessDialog,那么DialogResult不产生任
:何值,从而UI的改变导致了代码的改变。
:
:另一方面,我也不推荐通过构造函数对UI组件传递数据。构造函数是用来对其所描述的
:类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。
:利用构造函数把一个数据传进来,而该数据跟这个类(System.Windows.Forms.Form)没有直
:接关系,那么这就是DataCorruption。
:
:.................(以下省略)

--
博士第一年:我要当一个牛博士
博士第二年:我要三年毕业
博士第三年:我要四年毕业
博士第四年:爱怎么着就怎么着吧
博士第……:苦海无边回头是岸
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日16:13:54星期三),站内信件

是难度肯定是有
模式啊框架啊什么的
就是前人总结的经验
就是写了n多代码总结出来的最好的方式,所谓的最佳实践,这么搞总体效率最高,所以才
这样
如果是本着自己用用不维护的目的,自然也就无所谓模式框架什么的
不过如果是工业化的开发,不是玩玩的代码,这些模式啊框架啊就是极其有用了

但是写代码可以没有洁癖,但不能不爱干净
--

上善若水
水利万物而不争
Helloyou,Hellome,HelloWorld...
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日16:30:12星期三),站内信件

UI组件和数据的绑定说到点上了。。。
我觉得这地方也不用完全追求分离
其实Winform里面UI组件和数据本来就是在一起的
比如xxxForm类里面经常有个类似RefreshData方法,从理论上来说这也是不合理的,Form
就应该做Form的事情,显示东西和操作交互就行了,把数据的操作放在另一个地方,也就
是MVC模式,但这样显然不可能,至少还需要一个方法去通知数据的变化,于是就妥协的保
留了一两个类似RefreshData这样的方法,也被叫成MVP模式
一般而言这种实现方式还是不错的,这种方式下Form一般只持有一个对DataModel的引用,
然后拥有一个类似RefreshData这样的数据响应方法,而我也经常习惯于在构造器中要求传
入这样的DataModel,因为我看来这种情况下Form和Data就是一体,没有DataModel的Form
是没有意义的

P.S.WPF引入数据绑定后,DataContext之类概念后,实现变得漂亮很多~Form终于不用自
己去持有那个对DataModel的引用了
【在hustorochi(MarkZhou)的大作中提到:】:
:我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于DialogResult,它依赖于
:ModalDialog,如果程序显示的是一个ModalessDialog,那么DialogResult不产生任
:何值,从而UI的改变导致了代码的改变。
:
:另一方面,我也不推荐通过构造函数对UI组件传递数据。构造函数是用来对其所描述的
:类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。

--

上善若水
水利万物而不争
Helloyou,Hellome,HelloWorld...
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·


发信人:joshuaG(G|想念变成一条线在时间里面蔓延),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日16:31:08星期三),站内信件

我对自己的代码做CodeMetrics分析的时候,糟糕的地方都是在Winform代码里头出现的

【在yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!)的大作中提到:】
:UI组件和数据的绑定说到点上了。。。
:我觉得这地方也不用完全追求分离
:其实Winform里面UI组件和数据本来就是在一起的
:比如xxxForm类里面经常有个类似RefreshData方法,从理论上来说这也是不合理的,Form
:就应该做Form的事情,显示东西和操作交互就行了,把数据的操作放在另一个地方,也就
:是MVC模式,但这样显然不可能,至少还需要一个方法去通知数据的变化,于是就妥协的保
:留了一两个类似RefreshData这样的方法,也被叫成MVP模式
:一般而言这种实现方式还是不错的,这种方式下Form一般只持有一个对DataModel的引用,
:然后拥有一个类似RefreshData这样的数据响应方法,而我也经常习惯于在构造器中要求传
:入这样的DataModel,因为我看来这种情况下Form和Data就是一体,没有DataModel的Form
:.................(以下省略)

--
┃┓·┓·爱好者协会
★和平演变★┃┃┓┏┓┣┓╋┳┓┓┳┓┏┓┍┅━┅━┅━┅
┃┗┻┗┫┛┗┗┛┗┻┛┗┗┫┃ID:joshuaG
通行证│┗┛┗┛┃
━━━━──┼────────────────┺┉编号:07
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·[FROM:UtopianBlue]


发信人:yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!),信区:DotNet
标题:Re:[求教]C#如何两窗口之间发送消息
发信站:武汉白云黄鹤站(2009年03月11日16:55:10星期三),站内信件

因为form的概念本身就可维护性不怎么样
属于20世纪90年代快速开发概念的遗留产物
iphoneandroid包括asp.netmvc都抛弃form概念
winformwebform最后都没有成功

【在joshuaG(G|想念变成一条线在时间里面蔓延)的大作中提到:】
:我对自己的代码做CodeMetrics分析的时候,糟糕的地方都是在Winform代码里头出现的
:【在yayxcn(羊肉贩子):贩卖羊肉和代码(ohYannic!)的大作中提到:】
::UI组件和数据的绑定说到点上了。。。
::我觉得这地方也不用完全追求分离
::其实Winform里面UI组件和数据本来就是在一起的
::比如xxxForm类里面经常有个类似RefreshData方法,从理论上来说这也是不合理的,Form

--

上善若水
水利万物而不争
Helloyou,Hellome,HelloWorld...
※来源:·武汉白云黄鹤站bbs.whnet.edu.cn·
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: