事件,是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#之事件的更多相关文章

  1. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  2. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  4. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  6. 移动端IOS点击事件失效解决方案

    解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...

  7. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

  8. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  9. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  10. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

随机推荐

  1. iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库

    一种新的第三方库管理工具:Carthage 如何使用Carthage管理iOS依赖库 Podfile Syntax Reference v1.1.0.rc.3 https://guides.cocoa ...

  2. Apache配置文件讲解

        持续作用扩展自 HTTP/1.0 和 HTTP/1.1 的长连接特性.提供了长效的 HTTP 会话,用以在同 一个 TCP 连接中进行多次请求. 在某些情况下, 这样的方式会对包含大量图片的 ...

  3. JAVA 1.9 面向对象之封装

    1. 面向对象程序设计的三大基本特征:继承(Inheritence).封装(Encapsulation).多态(Polymorphism)2. 封装:类包含了数据与方法,将数据与方法放在一个类中就构成 ...

  4. Android 自定义Adapter 但listview 只显示第一条数据

    <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content ...

  5. Android开发之Git配置

    Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...

  6. k.APR通道特殊配置

    APR/native specific configuration The following attributes are specific to the APR/native connector. ...

  7. SQL SERVER与SSIS 数据类型对应关系

  8. 阿里云docker

    https://cr.console.aliyun.com docker 安装mysql image sudo docker pull  mysql docker  运行 mysql docker r ...

  9. Android Studio安装和配置(个人研究,有错请指导)

    安装Android Studio的原因:公司有app开发者,然而公司没有测试,只好互相测试,本人并没有接触过app开发,纯小白: 自己试着安装了一下Android Studio来这里记录并分享遇到的问 ...

  10. Entity framework在用于WCF时创建数据模型的问题

    众所周知,WCF的传输对象,在创建时需要在类名上标识[DataContract]以及在属性上标识[DataMember],当我们在使用Entity framework时(不考虑Code first的情 ...