C#之事件
事件,是C#编程模型中重要的一个概念,通过对事件的理解,可以更好的了解C#程序运行机制。C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以根据事件的消息有所反应。这非常类似设计模式中的观察者模式。
引发事件的类或对象,可以称之为事件源,注册并对处理事件的类或者对象可以称为事件订阅者或者事件监听者,我比较喜欢称之为事件监听者。
比如:构建一个winform应用,在窗体Form1简单放置一个按钮控件,然后,双击按钮,则可以进入代码视图中按钮click事件处理程序。
private void button1_Click(object sender, EventArgs e)
{
///sender即表示事件源,e表示通过事件传递过来的消息
}
这时,还可以打开Form1.designer.cs,还可以找到如下代码:
this.button1.Click += new System.EventHandler(this.button1_Click);
这行代码表明,当前窗体注册了click事件(click就是Button对象的一个事件),并且用 button1_Click方法进行了处理。EventHandler是一个委托
以上是对C#事件的一些简单的解释。当然,我们也可以自定义事件。
自定义事件,分为如下几步:
第一步:首先在事件源对象定义事件
//定义事件
public event EventHandler myevnet;
第二步:在事件监听者,订阅事件
//事件注册
this.myevnet+=new EventHandler(MyEventHandler);
第三步:在事件监听者,编写事件处理代码:
/// <summary>
/// 事件的处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyEventHandler(object sender, EventArgs e)
{
MessageBox.Show("myevent is raised.......");
}
第四步:在事件源对象引发事件
//判断事件是否被注册
if (myevnet != null)
{
//引发事件
myevnet(this.button1, new EventArgs());
}
这仅是个演示,供各位参考,下面给出完整代码,方便测试
简单自定义事件,完整代码
public partial class Form1 : Form
{
//定义事件
public event EventHandler myevnet; public Form1()
{
InitializeComponent();
//事件注册
this.myevnet+=new EventHandler(MyEventHandler); } private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("button1_Click");
//判断事件是否被注册
if (myevnet != null)
{
//引发事件
myevnet(this.button1, new EventArgs());
}
}
/// <summary>
/// 事件的处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyEventHandler(object sender, EventArgs e)
{
MessageBox.Show("myevent is raised.......");
} }
当然,真环境下,自定义事件要比这个复杂一些,下面再举一个例子,在事件引发时,传递自定义的消息。
首先要自定义一个事件消息类,这个类继承于EventArgs
然后自定义委托,来处理事件。完整代码如下:
事件源方面:
事件源代码
///自定义事件委托
public delegate void MyeventHandler(object sender, MyEventArgs e);
public partial class AddGrade : Form
{
//声明事件
public event MyeventHandler myCustomevent;
public AddGrade()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//dosomthing
//事件引发
if (myCustomevent != null)
{
myCustomevent(this, new MyEventArgs() { Message = this.textBox1.Text });
}
} } ///自定义事件消息类
public class MyEventArgs : EventArgs
{
public string Message { set; get; }
}
事件监听者方面:
事件监听
public partial class EventDemo : Form
{
public EventDemo()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
AddGrade addGrad = new AddGrade();
//注册事件
addGrad.myCustomevent += new MyeventHandler(addGrad_myCustomevent);
addGrad.Show();
} void addGrad_myCustomevent(object sender, MyEventArgs e)
{
//dosomthing
MessageBox.Show(e.Message);
} }
C#之事件的更多相关文章
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- HTML 事件(一) 事件的介绍
本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...
- HTML 事件(二) 事件的注册与注销
本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
随机推荐
- JS汉语转拼音脚本
测试代码: var anhui = "安徽"; //获得全拼 pinyin.getFullChars(anhui); //获得首拼 pinyin.getCamelChars(anh ...
- GOLANG 基本数据类型 整型
基本数据类型-整型 种类 有符号(负号) int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...
- Arduino 极速入门系列 - 光控灯(2) - 关于开关,上拉、下拉电阻那些事
接上篇,这次继续讲解光控灯的另外两个组成部分 - 开关和光敏电阻,光控灯里面将会有自锁开关按钮和光敏电阻.这此主要给新玩电子的朋友解释一下开关按钮的做法. 开关按钮的引脚电平读取问题 - 新手专用 我 ...
- linkedin开源的kafka-monitor安装文档
linkedin开源的kafka-monitor安装文档 linkedin 开源的kafka-monitor的安装使用可以参考官方的readme:流程介绍的已经比较清楚,但是还是有一些地方需要修正.让 ...
- java文章显示内容部分(将html转成纯文本)
public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...
- 汇编语言写出的helloworld运行过程
一:首先说一点,这篇文章建立在懂一点汇编的基础上,有几个简单的命令,说以下: 1:-r命令 -r 查看寄存器 -r 寄存器 (如 -r AX) 修改寄存器的值: 2:-d命令 -d 地址:xxxx:x ...
- Oracle Data Guard的配置
概述 Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数 ...
- PHP获取当前时间戳,当前时间、及解决时区问题
一.获取当前时间戳 方法1:通过time函数 time(); 方法2:通过$_SERVER中的REQUEST_TIME元素 $_SERVER['REQUEST_TIME']; 方法3:通过strtot ...
- linux环境初始化 用户问题
linux 初始化系统配置(centos6) (2013-04-03 13:19:15) 转载▼ 分类: linux 这篇博文是从别处转来的,原文地址http://zhoualine.iteye. ...
- jquery on 绑定多个事件 多个元素
$('.wrap').on({ click:function(){ //事件1 ...... }, keyup:function() { //事件2 ....... }, keydown:functi ...