例说.NET事件的使用

一 概要

本文通过实例介绍了.NET事件的使用方法。


二 实例演示

新建Windows应用程序EventExp,程序结构如下图所示。

 

图1 程序结构图

新建教师类Teacher(类文件为Teacher.cs),Teacher类为事件发布者。

Teacher类的详细代码如下所示。

//************************************************************  
//  
// CLR事件示例代码  
//  
// Author:三五月儿  
//   
// Date:2014/08/31 
//  
// http://blog.csdn.net/yl2isoft  
//  
//************************************************************  
using System;
using System.Windows.Forms;
 
namespace EventExp
{
    public class Teacher
    {
        public Teacher (){}
 
        public event EventHandler<AskEventArgs> Ask;
        public void Raise()
        {
            MessageBox.Show("MrWang:Who is on duty today?");
            RaiseDutyInfo();
        }
        private void RaiseDutyInfo()
        {
            EventHandler<AskEventArgs> ask = Ask;
            if (ask != null)
            {
                ask(this, new AskEventArgs());
            }
        }      
    }
    public class AskEventArgs : EventArgs
    {
    }
}

Teacher类中定义类型为EventHandler<AskEventArgs>的事件Ask,该事件在方法RaiseDutyInfo中触发,在事件被触发前会向窗体弹出"MrWang:Who is on duty today?”的消息框。

查看EventHandler<AskEventArgs>类型的定义,如下所示:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

从定义中可以了解到,EventHandler<AskEventArgs>本质上是一个委托,该委托使用带两个参数且不具有返回值的方法,第一个参数是包含事件发布者的对象,而第二个参数提供与事件相关的信息,该参数必须派生自EventArgs类,本实例中不需要提供任何与事件相关的信息,所以AskEventArgs类不包含任何实现代码。本例中使用的EventHandler<AskEventArgs>由.NET定义,当然我们也可以自己定义所需的事件类型,关于这点等以后有机会再探讨。

 

3 新建学生类Student(类文件为Student.cs),Student类为事件的订阅者。

Student类的详细代码如下所示。

//************************************************************  
//  
// CLR事件示例代码  
//  
// Author:三五月儿  
//   
// Date:2014/08/31 
//  
// http://blog.csdn.net/yl2isoft  
//  
//************************************************************  
using System.Windows.Forms;
 
namespace EventExp
{
    public class Student
    {
        private string name;
        private bool isOnDuty;
        public Student(string name, bool isOnDuty)
        {
            this.name = name;
            this.isOnDuty = isOnDuty;
        }
        public void Answer(object sender, AskEventArgs e)
        {
            if (isOnDuty)
            {
                MessageBox.Show(string.Format("{0}:{0} is on duty today!", name, name));
            }
            else
            {
                MessageBox.Show(string.Format("{0}:{0} is not on duty today!", name, name));
            }
        }
    }
}

Student类的Answer方法满足EventHandler<AskEventArgs>委托的要求,所以该方法可以作为Teacher类的Ask事件的事件处理方法。

 

4 程序的主画面如下图所示。

 

图2 程序主画面

程序主画面的后端代码如下所示。

//************************************************************  
//  
// CLR事件示例代码  
//  
// Author:三五月儿  
//   
// Date:2014/08/31 
//  
// http://blog.csdn.net/yl2isoft  
//  
//************************************************************  
 
using System;
using System.Windows.Forms;
 
namespace EventExp
{
    public partial class Form1 : Form
    {
        Student zhangSan;
        Student liSi;
        Student wangWu;
        Student tiana;
        Teacher mrWang;
 
        public Form1()
        {
            InitializeComponent();
 
            zhangSan = new Student("张三", true);
            liSi = new Student("李四", true);
            wangWu = new Student("王五", true);
            tiana = new Student("三五月儿", false);
            mrWang = new Teacher();
            //订阅事件
            mrWang.Ask += zhangSan.Answer;
            mrWang.Ask += liSi.Answer;
            mrWang.Ask += wangWu.Answer;
            mrWang.Ask += tiana.Answer;
            //取消订阅事件
            mrWang.Ask -= liSi.Answer;
            mrWang.Ask -= wangWu.Answer;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            mrWang.Raise();
        }
    }
}

在Form1类中,实例化Student类,得到学生对象zhangSan、liSi、wangWu及tiana,先让所有学生对象都订阅Teacher对象mrWang的Ask事件,随后取消liSi与wangWu两位同学的事件订阅。这样一来,mrWang的Ask事件被触发后,zhangSan和tiana将会执行自己的事件处理方法,而liSi与wangWu将不会,因为他们无法感知到mrWang的Ask事件的发生。zhangSan和tiana在自己的事件处理方法中,会弹出消息框,显示“zhangSan:zhangSan is on duty today!”和“三五月儿:三五月儿 is not on duty today!”。

 

程序运行后的效果如下图所示,与第4步的分析结果保持一致。

 

图3 程序运行效果图

 

三 总结

1 事件是基于委托的。

2 事件编程模型包含事件发布者,事件订阅者以及两者之间的订阅关系三部分。

3 事件编程模型是观察者模式的一种实现。

4 使用事件编程模型一般包含以下几步:

  • 定义事件的类型参数(AskEventArgs类)
  • 定义事件发布者的类(Teacher类)
  • 在事件发布者的类中定义事件(Teacher类的Ask事件)
  • 在事件发布者的类中定义事件通知方法,事件将在该方法中被触发,方法被触发后会去执行事件处理方法(Teacher类的RaiseDutyInfo方法)
  • 定义事件订阅者的类(Student类)
  • 在事件订阅者的类中定义事件处理方法,该方法的定义必须满足事件使用的委托的定义一致(Student类的Answer方法)
  • 订阅事件(Form1中通过“+=”和“-=”完成事件的订阅及取消订阅的操作)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容介绍: ASP.NET是微软.NET战略中的一个重要成员,除了可以使用Visual C#、VB.NET、VisualC++.NET、JScript.NET等语言编写外,还可以使用第三方的.NET接口(如COBOL.NET、 Perl.NET等)进行编写。本书通过100个精彩实例,由浅入深介绍了ASP.NET网络程序设计的编程方法与实用技巧。为了方便读者学习与深入理解ASP.NET,本书将这100 个实例分为4篇,即基础编程实例、中级编程实例、高级编程实例与混合编程实例。在每个实例中,除了介绍ASP.NET中所提供的基础知识点及编程技巧外,还介绍了ASP.NET在网络编程、图形编程、多媒体编程、Mobile(移动通信)等方面的重要应用及开发技术。本书附赠一张光盘,其中包括全部100个实例源代码及可执行文件(详细内容请参见光盘中的“本书配套光盘说明.txt”). 本书体系结构清晰,解释说明详尽,开发实例典型,适合于计算机编程用户、网络用户及对ASP.NET感兴趣的用户阅读,也可作为ASP.NET培训参考书。 书籍目录: 第1篇ASP.NET基础编程实例 实例1一个HTML化的ASP.NET程序 实例2ASP+WebForms广告轮换控制过程 实例3驱动器列表应用 实例4列出当前盘上目录和文件 实例5使用“文件预览”显示文件夹信息 实例6使用递归循环以显示目录列表 实例7在ASP.7NET中随意创建图形信息 实例8在ASP.8NET中显示事件日志记录(1) 实例9在ASP.9NET中显示事件日志记录(2) 实例10在ASP.10NET中使用DataGrid分页 实例11在ASP.11NET访问Excel2000/XP文件 实例12显示当前浏览器头信息 实例13利用ASP.NET获取主机名和IP地址 实例14由域名获取其IP地址 实例15由IP地址获得其域名 实例16ASP.NET中的正则表达式应用 实例17主机远程控制与探测应用 实例18ASP.NET控件———AdRotator应用 实例19ASP.NET日历程序 实例20查看主机内存情况 实例21ASP.NET简易应用程序“Hello,22World!” 实例22读取Config.22Web配置文件 实例23显示BrowseCaps配置段内容 实例24写入文件操作与应用 实例25文件读操作及应用 实例26文件删除与应用 实例27ASP.NET中异常处理及其应用 实例28AutoPostBack技术及其应用 实例29用户合法性验证与应用 实例30ASP.30NET列表框应用 实例31Calendar控件操作与应用 实例32用户操作验证与应用 实例33CompareValidator服务器比较控件操作与应用 实例34CustomValidator控件操作与应用 实例35服务器端控件ValidationSummary应用操作 实例36HtmlTable控件操作与应用 实例37在HTML控件中运用样式 实例38在Web服务器控件中运用样式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值