委托应用①——窗口之间方法/控件调用
2015-06-26 18:08
363 查看
最近重新拿起以前的书看,发现关于委托和事件一直没有很好的理解,或者说理解了也不知道到底这个东西有什么用,今天恰好碰到了一个窗口之间方法调用的问题(至于控件的调用其实是一样的,方式一样),问题描述如下:
Form1中有一个刷新方法Refreash(),Form1用dialog方式打开Form2,我需要在更改完Form2后,也就是关闭Form2的时候刷新Form1,也就是调用Form1的Refreash()方法
这个问题对于我来说不算太难,通常我的处理方式是这样子的:把Form1作为参数直接传递给Form2,然后在Form2关闭的时候实例化Form1,调用Refreash方法,还有方法二,把Refreash方法直接定义成static,当然问题随之而来,如果你的Refreash中有控件的话,你需要把控件的private改成public才不会报错!
我这里希望用委托的方式来实现,另外我觉得把委托理解成抱大腿模式更容易理解,我把我的理解写在了注释中,仔细看,以下是我的解决方案:
新建Form2窗口,代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Learn_Form_Delegate { public partial class Form2 : Form { /// <summary> /// 定义委托 /// </summary> public delegate void testDelegate(); /// <summary> /// 定义委托事件 /// </summary> public event testDelegate refreshForm; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //执行委托事件 //具体执行的到底是什么,form2并不关心, //如果你订阅了我的refreshForm事件, //那么我执行refreshForm的时候你就必须响应 refreshForm(); this.Close(); } } }
下面是Form1,代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Learn_Form_Delegate { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f = new Form2(); //这里订阅Form2的refreshForm()事件,具体你怎么执行我不管, //我把我的RefreshForm1()绑定在了你的refreshForm()事件上, //不管你在何时何地执行了你的refreshForm()事件, //那么我的refreshForm1()事件就会跟着执行,因为我已经抱住你的大腿了! f.refreshForm += new Form2.testDelegate(RefreshForm1); f.ShowDialog(); } public void RefreshForm1() { button1.Text = "Good job!"; } } }
执行效果如下:
我以前不太理解观察者模式,写完这个我觉得可以用更通俗的理解,叫做抱大腿模式,我抱着你的大腿了,你去哪儿我就去哪儿,只要你执行了,我在你的大腿上,我也得执行!不知道大家觉得我的理解对不对呢?
如需源码请发邮件索取lipeng_3g@hotmail.com
(文章观点仅是个人理解,如果错误欢迎拍砖!)
相关文章推荐
- 自己回答自己的问题
- 第十六周oj刷题——Problem C: B 求类中数据成员的最大值-类模板
- Excel复杂排序和不同表复制数据业务实战
- Xcode and #pragma mark
- UVa - 1619 - Feel Good
- Xcode and #pragma mark
- UVa - 1619 - Feel Good
- Codeforces554D:Kyoya and Permutation
- 【密钥算法】Java加密技术(八)---Java证书体系
- 常用的JQuery数字类型验证正则表达式整理
- Xcode and #pragma mark
- sqlite数据库修改及升级
- sqlite数据库修改及升级
- java设计模式之——代理模式
- Fatal signal 11 (SIGSEGV) at 0x000001b4 (code=1), thread 7107
- 【密钥算法】Java加密技术(七)---ECC 数据加密算法
- sqlite数据库修改及升级
- aspcms中if判断语句的运用
- sqlite数据库修改及升级
- oracle 使用 UTL_FILE 导出表数据到txt文件