[.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html
序
之前通过《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》介绍了委托的基本知识,这次我们来看看事件。
目录
一、What's 事件
类或对象可以通过事件向其他类或对象发出通知。
发行者:触发(引发)事件的类或对象;
订阅者:接收(或处理)事件的类或对象。
在过去的开发中,经典的 WinForm 和 WebForm 是都通过事件驱动来体现他们的强大之处。通过 IDE,轻松订阅按钮和一些输入控件引发的事件,自动在类的空白处为我们添加事件处理程序的方法和订阅该事件的代码
二、事件的属性汇总
发行者确定何时引发事件;订阅者决定如何对事件作出响应。
一个事件可以被多个类或对象进行订阅,订阅者可以自由地选择合适的方式进行处理。
没有订阅者进行订阅的事件永远也不会被触发
WinForm 和 WebForm 中的事件通常用来表示用户执行的某项操作。
当一个事件包含多个订阅者时,在触发该事件的同时会默认以同步的形式调用事件处理程序。
事件基于 EventHandler 委托和 EventArgs 基类。
三、事件的订阅和取消
1.用 IDE 订阅事件

图3-1-1 新建一个 WinForm 项目

图3-1-2 由图1双击时所自动创建的代码

图3-1-3 除了图2,在 InitializeComponent 方法也自动增加了这行代码
2.以编程方式订阅事件
假设现在是一个新的 WinForm 程序,我们通过手动的方式自己创建事件。在 InitializeComponent 方法下面输入 this.Load +=,然后会出现提示,这时我们按下“Tab 键”,

图3-2-1
会发现也会自动创建事件处理程序,效果跟上一节的直接双击空白处创建的代码可以说是一致的,代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); this.Load += Form1_Load;
} private void Form1_Load(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
这次,我们直接采用 lambda 方式完成事件的注册:点击空白处显示鼠标点击时的坐标。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); //this.Load += Form1_Load; //点击事件(lambda 方式创建)
this.Click += (s, e) =>
{
MessageBox.Show($"{((MouseEventArgs)e).Location}");
};
} private void Form1_Load(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
【备注】内容涉及 $: (C# 6) 的语法,vs2015 以上才支持。$"{msg}" 相当于 string.Format("{0}", msg), msg 指变量。

图3-2-2
3.用匿名方法订阅事件
public Form1()
{
InitializeComponent(); //this.Load += Form1_Load; //点击事件(lambda 方式创建)
//this.Click += (s, e) =>
//{
// MessageBox.Show($"{((MouseEventArgs)e).Location}");
//}; //使用匿名方法创建事件
this.Click += delegate (object sender, EventArgs e)
{
var mouseEventArgs = (MouseEventArgs)e;
var mouseLocation = mouseEventArgs.Location; MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
};
}
【注意】建议不要使用匿名函数来订阅事件,因为这样会间接的增加取消订阅时的难度。除非你确定自己不会取消订阅。
4.取消订阅
你可以选择取消订阅事件,来防止触发对应的事件处理程序。你可以使用 -= 进行取消事件的订阅。
this.Load -= Form1_Load; //使用减法赋值运算符 (-=) 取消订阅事件
传送门
《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》
【参考】https://msdn.microsoft.com/zh-cn/library/awbftdfh(VS.80).aspx
【参考】微软 MSDN 官方文档
[.NET] C# 知识回顾 - 事件入门的更多相关文章
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- [C#] C# 知识回顾 - Lambda
C# 知识回顾 - Lambda 序 它是第十一个希腊字母,一个拥有失意.无奈.孤独.低调等含义的流行符号,也指示一款称为“半条命”的游戏. 不过,这次我所讲的是 C# 中的 Lambda. 目录 L ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
随机推荐
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- 邮件中嵌入html中要注意的样式
工作中常会有需求向用户发送邮件,需要前端工程师来制作html格式的邮件,但是由于邮件客户端对样式的支持有限,要兼容很多种浏览器需要注意很多原则: 1.邮件使用table+css布局 2.邮件主要部分在 ...
- 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...
- Mybatis XML配置
Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- C#通过NPOI操作Excel
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...
- Kooboo CMS技术文档之三:切换数据存储方式
切换数据存储方式包括以下几种: 将文本内容存储在SqlServer.MySQL.MongoDB等数据库中 将站点配置信息存储在数据库中 将后台用户信息存储在数据库中 将会员信息存储在数据库中 将图片. ...
- 在你的ASP.NET MVC中使用查找功能
在程序中,使用查找功能是少之不了.今天在ASP.NET环境下演示一回. 在cshtml视图中,有三个文本框,让用户输入关键词,然后点击最右连的“搜索”铵钮,如果有结果将显示于下面. Html: 表格放 ...