自定义CancelEventArgs类,封装事件参数信息,实现e.Cancle=true取消机制。

简介: 参考文章:http://blog.csdn.net/lastinglate/article/details/5753113 如果您正在设计可取消的事件,请使用CancelEventArgs(而非是EventArgs)作为事件数据对象e的基类。

参考文章:http://blog.csdn.net/lastinglate/article/details/5753113

如果您正在设计可取消的事件,请使用CancelEventArgs(而非是EventArgs)作为事件数据对象e的基类。

 使用场景:订阅者可以通过e.Cancle来控制发布者引发事件的方法是否被执行!类似窗体的Form_Closing事件机制。

CancelEventArgsDemo

 顺便有关静态事件链的实现,可以参考:http://www.cnblogs.com/wangiqngpei557/archive/2011/05/19/2051044.html

 /1.自定义EventArgs类,封装事件参数信息  

     public  class ActionCancelEventArgs:System.ComponentModel.CancelEventArgs  
    {  
         private  string message;  
         public ActionCancelEventArgs() :  this( false) { }  
         public ActionCancelEventArgs( bool cancel) :  this( false, String.Empty) { }  
         public ActionCancelEventArgs( bool cancel,  string message) :  base(cancel) {  
             this.message = message;  
        }  
         public  string Message {  getset; }  
    }  

[c-sharp] view plaincopyprint?
// 2.定义委托  
        public  delegate  void ActionEventHandler( object sender, ActionCancelEventArgs ev);  
        // 3.声明事件(用到委托类型)  
        public  static  event ActionEventHandler Action;  
         // 4.定义事件处理函数  
        protected  void OnAction( object sender, ActionCancelEventArgs ev)  
       {  
            if (Action !=  null)  
           {  
               Action(sender, ev);  
           }  
       }  

// 注册事件处理程序  
public  class BusEntity  
    {  
         string time = String.Empty;  
         public BusEntity() {  
             // 将事件处理程序添加到事件  
            Form1.Action +=  new Form1.ActionEventHandler(Form1_Action);  
        }  
         private  void Form1_Action( object sender, ActionCancelEventArgs e) {  
            e.Cancel = !DoActions();  
             if (e.Cancel)  
            {  
                e.Message =  " wasn't the right time. ";  
            }  
        }  
         private  bool DoActions() {  
             bool retVal =  false;  
            DateTime tm = DateTime.Now;  
             if (tm.Second< 30)  
            {  
                time =  " The time is  "+DateTime.Now.ToLongTimeString();  
                retVal =  true;  
            }  
             else  
            {  
                time =  "";  
            }  
             return retVal;  
        }  
         public  string TimeString {  
             get {  return time; }  
        }  
    }  

[c-sharp] view plaincopyprint?
private  void btnRaise_Click( object sender, EventArgs e)  
      {  
          ActionCancelEventArgs cancelEvent =  new ActionCancelEventArgs();  
          OnAction( this, cancelEvent);  
          //抛出事件后,将根据询问订阅者是否取消事件的接受e.Cancle=False/True,来执行后续的代码。
           if (cancelEvent.Cancel)  
          {  
              lblInfo.Text = cancelEvent.Message;  
          }  
           else  
          {  
              lblInfo.Text = busEntity.TimeString;  
          }  
      }  
目录
相关文章
|
12月前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
463 2
|
Linux Docker 容器
到底什么是镜像(概念)
镜像到底是什么?镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。 1.UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
21707 0
|
9月前
|
网络协议 网络安全
华为openEuler欧拉系统的防火墙常用设置方法
在有防火墙的系统中,比如我们部署了一个WEB项目,我们需要给该WEB项目所需的端口放行。本文介绍了防火墙常用设置方法。
1473 81
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
1061 0
|
Java jvm-sandbox 开发者
【alibaba/jvm-sandbox#03】JavaAgent 修改字节码的机制
开发者一般采用建立一个 Agent 的方式来使用 JVMTI,使用 JVMTI 一个基本的方式就是设置回调函数,在回调函数体内,可以 获取各种各样的VM级信息,甚至控制VM行为,如类加载时修改类
594 0
|
存储 设计模式 ARouter
现代化 Android 开发:组件化与模块化的抉择
本文为现代化 Android 开发系列文章第四篇。
385 0
|
程序员 Linux Android开发
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略