C#中的委托和事件(下篇)
上次以鸿门宴的例子写了一篇博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们。如果觉得意犹未尽,或者仍然不知如何在实际应用中使用它们,那么,这篇窗体篇,将在Winform场景中,用最简洁的方式,帮助大家真正用上C#中的委托和事件。
今天,咱们不讲场景,直接上真实的例子!
委托和事件,在Winform中最有代表性的应用,就是,一个窗体A发生某件事情的时候,其他窗体如果订阅了窗体A的某个事件,就会按照各自的方式,执行相关操作。
先上最终结果:



够简单吧。主窗体FormMain一共三个控件:btNew(Button, 新建窗体), txMsg(TextBox), btSend(Button, 发送指令);子窗体FormSub就一个有效控件:txExecute(TextBox)
要实现的功能是:在主窗体中,每单击一次“新建窗体”按钮,就会动态新建一个子窗体,子窗体的Text为"Form"+生成顺序。此功能与委托和事件无关啊。在主窗体中单击“发送指令”按钮,子窗体会接收主窗体中txMsg中的指令,并以各自的方式执行指令。为简化起见,子窗体的执行方式为,在txMsg前加上各自的生成顺序,然后显示。
就这么简单的功能,咱们就能彻底弄清楚在Winform中使用委托和事件的方法啦~
先排除干扰,在Winform工程中,拖拽生成FormMain和FormSub窗体及其控件,并编写主窗体中新建窗体按钮的点击事件,生成子窗体,并动态设置子窗体的Text属性(若这个不会,此文并不适合你,请先去看入门书籍。)此处略去若干字。。。。。。
下面将关键点:
还记得鸿门宴的例子吗?要子窗体(部下)听从主窗体(首领)的命令,应该在主窗体中按照规则写委托和事件:
public delegate void SendEventHandler(string msg); public event SendEventHandler SendEvent;
然后,在主窗体的“发送指令”按钮事件中,直接调用事件。那么,所有订阅了该事件的子窗体,都会各自执行相关操作。
当然,子窗体中需要声明一个主窗体,并在子窗体的构造函数中,需要带上主窗体作为形参,用该形参来实例化声明的主窗体(依然参考鸿门宴的例子,部下心中要有首领)
这个例子实在太简单了。下面直接上代码。对于弄懂了鸿门宴例子的朋友们,应该一看就懂。
FormMain.cs 代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; namespace FormEventExample
{
public delegate void SendEventHandler(string msg); public partial class FormMain : Form
{
public event SendEventHandler SendEvent; int num = 0; public FormMain()
{
InitializeComponent();
} private void btNew_Click(object sender, EventArgs e)
{
FormSub formSub = new FormSub(this, ++num); formSub.Show();
} private void btSend_Click(object sender, EventArgs e)
{
if (this.SendEvent!=null)
{
this.SendEvent(txMsg.Text);
}
}
}
}

FormSub.cs 代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; namespace FormEventExample
{
public partial class FormSub : Form
{
FormMain formMain;
int num; public FormSub(FormMain formMain, int num)
{
InitializeComponent(); this.formMain = formMain; this.num = num; this.Text = "Form" + num; this.formMain.SendEvent += new SendEventHandler(formMain_SendEvent);
} void formMain_SendEvent(string msg)
{
txExecute.Text = this.num.ToString() + ":" + msg;
}
}
}

各个控件的拖放,见本文开头的“最终结果”,我已将控件的Name写在那三张截图中。
剩下的事情,就是大家自己领悟,触类旁通了。在较大的Winform项目中,要用好委托和事件,也不是那么容易的。有时,还需要在自定义类中用上委托和事件,作为窗体间交互的纽带。
C#中的委托和事件(下篇)的更多相关文章
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- 第3章 C#中的委托和事件
.NET框架中的委托和事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...
- c#中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C#中的委托和事件(续)
转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...
随机推荐
- 注册.NET Framework 到IIS服务器
一.注册.NET 4.0 32位的Windows:--------------------------------------------------------------------------- ...
- 待修 Bug
# 乱码 ## 描述 环境:Tomcat 8 + Spring 4 + Spring Security. 问题描述: 在类 AbstractAnnotationConfigDispatcherServ ...
- MVC 组件之间的关系
View和Controller都可以直接请求Model 但是Model不依赖View和controller lController可以直接请求View来显示具体页面 View不依赖Controller ...
- C# 异步委托回调函数使用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- iOS 自定义UIButton
工作中有一个点击button更新button上文案的需求,用自定义了button可以很简单的实现的这个需求 首先写个自定义的button CustomButton.h #import <UIKi ...
- LINQ查询表达式---------let子句
LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class P ...
- 读取注册表获取Windows系统XP/7/8/10类型(使用wcscmp比较wchar[]内容)
很多方案是采用GetVersion.GetVersionEx这两个API来查询操作系统的版本号来判断当前的操作系统是Windows系列中的哪个,在Win10没有出现前,这种方法是行的通的,但是Win1 ...
- PyCharm安装MicroPython插件
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 PyCharm可以说是当今最流行的一款Pyth ...
- 利用AngularJS实现一个单页应用
看了下angular 的route,用它做个非常简单的单页面应用,记录一下. 顺便说下,好处是,页面改变时不需要刷新,而每个页面都展现不同的数据.尤其在使用模板页的时候,非常方便. 快速使用Roman ...
- 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))
注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...