码迷,mamicode.com
首页 > 其他好文 > 详细

委托应用①——窗口之间方法/控件调用

时间:2015-06-26 19:41:56      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:

  

转载请注明地址:http://www.cnblogs.com/havedream/p/4602974.html

 

  最近重新拿起以前的书看,发现关于委托和事件一直没有很好的理解,或者说理解了也不知道到底这个东西有什么用,今天恰好碰到了一个窗口之间方法调用的问题(至于控件的调用其实是一样的,方式一样),问题描述如下:

  Form1中有一个刷新方法Refreash(),Form1用dialog方式打开Form2,我需要在更改完Form2后,也就是关闭Form2的时候刷新Form1,也就是调用Form1的Refreash()方法

这个问题对于我来说不算太难,通常我的处理方式是这样子的:把Form1作为参数直接传递给Form2,然后在Form2关闭的时候实例化Form1,调用Refreash方法,还有方法二,把Refreash方法直接定义成static,当然问题随之而来,如果你的Refreash中有控件的话,你需要把控件的private改成public才不会报错!

  我这里希望用委托的方式来实现,另外我觉得把委托理解成抱大腿模式更容易理解,我把我的理解写在了注释中,仔细看,以下是我的解决方案:

 

新建Form2窗口,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 namespace Learn_Form_Delegate
12 {
13     public partial class Form2 : Form
14     {
15         /// <summary>
16         /// 定义委托
17         /// </summary>
18         public delegate void testDelegate();
19         /// <summary>
20         /// 定义委托事件
21         /// </summary>
22         public event testDelegate refreshForm;
23         public Form2()
24         {
25             InitializeComponent();
26         }
27 
28         private void button1_Click(object sender, EventArgs e)
29         {
30             //执行委托事件
31             //具体执行的到底是什么,form2并不关心,
32             //如果你订阅了我的refreshForm事件,
33             //那么我执行refreshForm的时候你就必须响应
34             refreshForm();
35             this.Close();
36         }
37     }
38 }


下面是Form1,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 namespace Learn_Form_Delegate
12 {
13     public partial class Form1 : Form
14     {
15         public Form1()
16         {
17             InitializeComponent();
18         }
19 
20         private void button1_Click(object sender, EventArgs e)
21         {
22             Form2 f = new Form2();
23             //这里订阅Form2的refreshForm()事件,具体你怎么执行我不管,
24             //我把我的RefreshForm1()绑定在了你的refreshForm()事件上,
25             //不管你在何时何地执行了你的refreshForm()事件,
26             //那么我的refreshForm1()事件就会跟着执行,因为我已经抱住你的大腿了!
27             f.refreshForm += new Form2.testDelegate(RefreshForm1);
28             f.ShowDialog();
29         }
30 
31         public void RefreshForm1()
32         {
33             button1.Text = "Good job!";
34         }
35     }
36 }

执行效果如下:

技术分享

技术分享

我以前不太理解观察者模式,写完这个我觉得可以用更通俗的理解,叫做抱大腿模式,我抱着你的大腿了,你去哪儿我就去哪儿,只要你执行了,我在你的大腿上,我也得执行!不知道大家觉得我的理解对不对呢?

如需源码请发邮件索取lipeng_3g@hotmail.com

(文章观点仅是个人理解,如果错误欢迎拍砖!)

 

委托应用①——窗口之间方法/控件调用

标签:

原文地址:http://www.cnblogs.com/havedream/p/4602974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!