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

  

转载请注明地址: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 }

执行效果如下:

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

如需源码请发邮件索取[email protected]

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

时间: 06-24

委托应用①——窗口之间方法/控件调用的相关文章

C# 委托实例(跨窗体操作控件)

原文地址 http://blog.csdn.net/bdstjk/article/details/7004035 FORM1(一个名为“打开form2”的button控件) FORM2(一个名为“改变form1颜色“的button控件) 启动时,FORM1中点击button控件“打开form2””使FORM2显示出来. 点击FORM2中的“改变form1颜色”后,Form1中颜色改变. 完整代码 1 using System; 2 using System.Collections.Generic

事件委托应用:在父控件中创建子控件,并接收值

传值过程使用委托方法 定义一个打开按扭,一个文本框 1 /// <summary> 2 /// 增加父控件 3 /// </summary> 4 public void AddParent(BaseControl ctl) 5 { 6 foreach (Control ct2 in this.Parent.Controls) 7 { 8 if (ct2.Name == ctl.Name) { 9 ct2.Focus(); 10 return; 11 } 12 } 13 ctl.Wi

QT 让窗口(或控件)居中

代码如下: [cpp] view plaincopyprint? XXX::XXX(QWidget *parent /* = 0 */) { .................. //注意,resize一定要放在这段代码的前面 resize(300, 300); int cx, cy; //当parent为空时,窗口就显示在桌面中央 if( NULL == parent ) { cx = (QApplication::desktop()->width() - width()) / 2; cy =

android include中的控件调用

项目中经常会有一些布局是重用的,但是如何来更好的利用这些布局中的控件 转: http://zhidao.baidu.com/link?url=GU93U8Wu31dfp7mKEx52hMJkxjFLCq3WGkvZ8IMrahQT3wgAbC1Y93sKQ36_GQo3V4-Q9KWRHD6RIxMgBYj0zY7YsYNQuGFGjahZsFnz9wq <include android:id="@+id/view_counter_buttons_1" layout="

C#通过事件跨类调用WPF主窗口中的控件

xaml.cs文件: 1 using System; 2 using System.Timers; 3 using System.Windows; 4 using System.Windows.Forms; 5 namespace ControlUsed 6 { 7 8 public partial class MainWindow 9 { 10 11 public MainWindow() 12 { 13 Monitor.PartEvent += OnStep;//将该类中的函数注册到Moni

VB.NET章鱼哥出品—怎样解决MDI子窗口被父窗口中的控件覆盖的问题

近期有个网友问我这个问题,我就上网搜了下,结果非常失望.有几个在CSDN上发的求助帖.看到最后都没有找到明白的答案. 这里笔者在网上找到了API函数SetParent(),并对网上的错误进行了改动,并给出了简单实例代码. 读者可自行測试: Public Class Form1 '作者:章鱼哥,QQ:3107073263 群:309816713 '如有疑问或好的建议请联系我.大家一起进步 '声明SetParent函数.这是一个API函数 Declare Function SetParent Lib

Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下:   1.UI控件与布局     2.MVVM     3.数据绑定     4.await/async     5.Linq查询     6.WCF RIA Services     7.序列化     8.委托与事件 1.UI控件与布局 常用的主要是Grid.StackPanel.Border,其中最常用的的是Grid,是一

控件绘制的四种方法

OWNER?DRAW实现自绘按钮 一准备工作 在您决定开发 Windows 提供的常规免费自定义控件范围之外的控件之后,您必需确定自己的控件将有多少独到之处 - 在功能和外观两方面.例如,我们假定您正在创建一个类似于计速表的控件.由于公共控件库 (ComCtrl32.dll) 中没有类似的控件,您完全需要自己进行以下操作:编写所有控件功能需要的代码,进行绘制,默认终端用户的交互,以及控件与其父窗口之间需要的任意消息处理. (#add 两方面,公共控件库中没有类似的 完全重写;? 只想调整公共控件

线程间操作无效:从不是创建控件的线程访问它的三种方法

访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. 解决办法 1.把CheckForIllegalCrossThreadCalls设置为false 在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为