• C#窗口间传递消息


    链接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变量,点击保存按钮把消息传给这个变量,但是点击之
    后又如何立刻知道这个变量被修改了呢?
    
    --
    
    You are beautiful, You are beautiful, it's true.
    
    But it's time to face the truth...I will never be with you...
    
      ╭———╮
    
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
    发信人: joshuaG (Big G|Solution, Revolution, Evolution), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月04日22:11:13 星期三), 站内信件
    
    例如说你要把对话框里的一个TextBox的文本保存在MainForm里头,这样
    
    假设这个TextBox是_tb
    
    在DialogForm中定义一个Property:
    
    public string Data { get{return _tb.Text;}}
    
    同时把保存按钮的DialogResult属性设置为OK
    
    然后在MainForm的打开对话框的方法中写
    
    DialogForm frm=new DialogForm();
    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:
    --
    You are beautiful, You are beautiful, it's true.
      ╭———╮
      │╯╰ │
      │ 口 ├┬—╮
      ╰——┬╯│╭╯
      ╯ ╯╰—
    
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
    发信人: hustorochi (Mark Zhou), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月09日20:48:08 星期一)
    
    请使用事件解决此问题。
    
    首先需要在 Dialogform 中声明如下事件和函数。
    
    public event EventHandler SavedData;
    
    protected virtual void OnSavedData(EventArgs e)
    {
        if (this.SavedData != null)
        {
            this.SavedData(e);
        }
    }
    
    然后在"保存"按钮处理事件中引发该事件。
    
    private void OnSaveButtonClick(object sender, EventArgs e)
    {
        // TODO: Save your data.
        WriteDataToFile();
        OnSavedData(new EventArgs());
    }
    
    最后在 MainForm 打开对话框的时候。
    
    public void OnOpenDialogMenuItemClick(object sender, EventArgs e)
    {
        DialogForm form = new DialogForm();
        // Subscribe the SavedData event.
        form.SavedData += (_sender, _e) => RefreshData();
        form.ShowDialog();
    }
    
    请尽量减少使用通过 ShowDialog() 的返回值 DialogResult 判断商业逻辑。这样会导致
    无法维护的代码增加。
    
    【 在 CCBB 的大作中提到: 】
    : 一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话..
    : 口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入..
    : 中。
    
    --
    Mark Zhou
    Software Design Engineer (SDE)
    Solution Delivery Engineer at Microsoft
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
    发信人: joshuaG (G | 我们如何才能更加了解彼此呢?), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月09日22:28:41 星期一), 站内信件
    
    学习了
    【 在 hustorochi (Mark Zhou) 的大作中提到: 】
    : 
    : 请使用事件解决此问题。
    : 
    : 首先需要在 Dialogform 中声明如下事件和函数。
    : 
    : public event EventHandler SavedData;
    : 
    --
    
    I Love Rock & Roll
    
        I Love Art & War
    http://newhost.byhh.net/f/DotNet/1161499057/eyes.jpg
            I Love U After All 
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
    发信人: doubleclick (强悍地解释人生), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月09日23:38:16 星期一), 站内信件
    
    融哥能否谈谈 "请尽量减少使用通过 ShowDialog() 的返回值 DialogResult 判断商业逻
    辑。这样会导致
    无法维护的代码增加。" 这具体是如何引起的? 另外就楼主这个问题,这里为什么不用for
    m2的构造器直接传参数进去? 
    
    谢谢
    
    【 在 hustorochi (Mark Zhou) 的大作中提到: 】: 
    : 请使用事件解决此问题。
    : 
    : 首先需要在 Dialogform 中声明如下事件和函数。
    : 
    : public event EventHandler SavedData;
    : 
    : protected virtual void OnSavedData(EventArgs e)
    : {
    :     if (this.SavedData != null)
    : .................(以下省略)
    
    --
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·[FROM: fox23.cnblogs.com
    发信人: yuxhust (happy fish), 信区: 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 (happy fish) 的大作中提到: 】
    : 按LZ的需求,也可以用MDIParent窗体
    : 【 在 CCBB 的大作中提到: 】
    : : 一个主窗口MainForm和一个对话框窗口DialogForm。主窗口通过一个菜单项调出对话..
    : : 口。对话框窗口有个保存按钮,点击保存按钮后,对话框关闭,并且将保存信息存入..
    : : 中。
    : : 问题是:当点击保存按钮后,如何告知MainForm这个消息呢,我想要点击保存后就能..
    
    --
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·[FROM:Utopian Blue]
     
    发信人: yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日00:32:29 星期三), 站内信件
    
    ~这个非常好
    可以算是一个利用事件的最佳实践吧
    事件或者观察者模式在这里产生的松耦合是非常有意义的
    
    【 在 hustorochi (Mark Zhou) 的大作中提到: 】
    : 
    : 请使用事件解决此问题。
    : 
    : 首先需要在 Dialogform 中声明如下事件和函数。
    : 
    : public event EventHandler SavedData;
    : 
    
    --
    
        上善若水
        水利万物而不争
    Hello you, Hello me, Hello World...
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
    发信人: yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!), 信区: 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的构造器直接传参数进去? 
    : 谢谢
    
    --
    
        上善若水
        水利万物而不争
    Hello you, Hello me, Hello World...
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
    发信人: hustorochi (Mark Zhou), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日12:57:17 星期三)
    
    我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于 DialogResult,它依赖于
     ModalDialog,如果程序显示的是一个 Modaless Dialog,那么 DialogResult 不产生任
    何值,从而 UI 的改变导致了代码的改变。
    
    另一方面,我也不推荐通过构造函数对 UI 组件传递数据。构造函数是用来对其所描述的
    类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。
    利用构造函数把一个数据传进来,而该数据跟这个类(System.Windows.Forms.Form)没有直
    接关系,那么这就是 Data Corruption。
    
    所以,这里最好的设计模式就是 Subscribe -> Observer。
    
    【 在 yayxcn 的大作中提到: 】
    : DialogResult也就用CommonDialog时候好用
    : 自己定义的DialogForm形式多样,DialogResult并不是一个必须的东西,不是规范
    : 所以完全没有办法保证自定义的DialogForm会返回这么个对象
    : 换句话说
    : 如果在主程序里面试用了DialogResult,那么主程序就对DialogForm有了依赖,依赖..
    : 自于DialogResult
    : lz的问题看情况
    
    --
    Mark Zhou
    Software Design Engineer (SDE)
    Solution Delivery Engineer at Microsoft
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
    发信人: wpboy (我爱抬杠,但我更爱真理), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日13:05:32 星期三), 站内信件
    
    我以前写代码很有洁癖,觉得就应该用正确的优雅的方法。
    然后偶然发现好比“单身宿舍”,如果不考虑以后扩展为
    两人世界三口之家的,为啥搞这么干净,人活得多累啊。
    很多人写的小程序可能也就他自己用用,别人都不会去维
    护的,更不会去扩展,所以能以最简单的方法搞定即可。
    有时太多的模式啊框架啊,对于我们这种入门级的,还是
    很有难度的。是吧,加菲~~敲这么多字不容易
    
    【 在 hustorochi (Mark Zhou) 的大作中提到: 】
    : 
    : 我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于 DialogResult,它依赖于
    :  ModalDialog,如果程序显示的是一个 Modaless Dialog,那么 DialogResult 不产生任
    : 何值,从而 UI 的改变导致了代码的改变。
    : 
    : 另一方面,我也不推荐通过构造函数对 UI 组件传递数据。构造函数是用来对其所描述的
    : 类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。
    : 利用构造函数把一个数据传进来,而该数据跟这个类(System.Windows.Forms.Form)没有直
    : 接关系,那么这就是 Data Corruption。
    : 
    : .................(以下省略)
    
    --
    博士第一年:我要当一个牛博士        
    博士第二年:我要三年毕业            
    博士第三年:我要四年毕业            
    博士第四年:爱怎么着就怎么着吧      
    博士第……:苦海无边回头是岸        
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
     
    发信人: yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日16:13:54 星期三), 站内信件
    
    是 难度肯定是有
    模式啊框架啊什么的
    就是前人总结的经验
    就是写了n多代码总结出来的最好的方式,所谓的最佳实践,这么搞总体效率最高,所以才
    这样
    如果是本着自己用用不维护的目的,自然也就无所谓模式框架什么的
    不过如果是工业化的开发,不是玩玩的代码,这些模式啊框架啊就是极其有用了
    
    但是写代码可以没有洁癖,但不能不爱干净
    --
    
        上善若水
        水利万物而不争
    Hello you, Hello me, Hello World...
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
     
    发信人: yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!), 信区: 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 (Mark Zhou) 的大作中提到: 】: 
    : 我们在编写程序的时候,应该尽量减少组件之间的偶合性,对于 DialogResult,它依赖于
    :  ModalDialog,如果程序显示的是一个 Modaless Dialog,那么 DialogResult 不产生任
    : 何值,从而 UI 的改变导致了代码的改变。
    : 
    : 另一方面,我也不推荐通过构造函数对 UI 组件传递数据。构造函数是用来对其所描述的
    : 类进行实例化的,而不是用来传递数据的;换句话说,构造函数应该干他应该干的事情。
    
    --
    
        上善若水
        水利万物而不争
    Hello you, Hello me, Hello World...
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
     
     
    发信人: joshuaG (G|想念变成一条线 在时间里面蔓延), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日16:31:08 星期三), 站内信件
    
    我对自己的代码做Code Metrics分析的时候,糟糕的地方都是在Winform代码里头出现的
    
    【 在 yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!) 的大作中提到: 】
    : 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:Utopian Blue]
     
     
    发信人: yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!), 信区: DotNet
    标  题: Re: [求教]C#如何两窗口之间发送消息
    发信站: 武汉白云黄鹤站 (2009年03月11日16:55:10 星期三), 站内信件
    
    因为form的概念本身就可维护性不怎么样
    属于20世纪90年代快速开发概念的遗留产物
    iphone android 包括asp.net mvc都抛弃form概念
    winform webform最后都没有成功
    
    【 在 joshuaG (G|想念变成一条线 在时间里面蔓延) 的大作中提到: 】
    : 我对自己的代码做Code Metrics分析的时候,糟糕的地方都是在Winform代码里头出现的
    : 【 在 yayxcn (羊肉贩子): 贩卖羊肉和代码 (oh Yannic!) 的大作中提到: 】
    : : UI组件 和 数据 的绑定说到点上了。。。
    : : 我觉得这地方也不用完全追求分离
    : : 其实Winform里面UI组件和数据本来就是在一起的
    : : 比如xxxForm类里面经常有个类似RefreshData方法,从理论上来说这也是不合理的,Form
    
    --
    
        上善若水
        水利万物而不争
    Hello you, Hello me, Hello World...
    ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·
  • 相关阅读:
    java开发实战经典
    defer属性---->执行外部脚本
    深入理解JavaScript 模块模式
    JavaScript模块化开发一瞥
    缓存是新的内存
    php站点
    数据库
    .NET中使用Redis
    Scrum中的User Story
    如何编写敏捷开发中的user story
  • 原文地址:https://www.cnblogs.com/CCBB/p/1443412.html
Copyright © 2020-2023  润新知