首页 > 如何使用事件

如何使用事件

事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。

有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。

比如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。

EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:

delegate void 事件委托名(object sender,EventArgs e);

object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。

示例:

 

ContractedBlock.gifExpandedBlockStart.gifCode

using System;



namespace EventDemo

{

    
/// 

    
/// Summary description for Class1.

    
/// 


    class EventReceiver

    {

        
/// 

        
/// The main entry point for the application.

        
/// 


        [STAThread]

        
static void Main(string[] args)

        {

            EventSender c1 
= new EventSender();

            
//委托实例化后绑定到事件

            c1.OnUserRequest += new UserRequest(c1_OnUserRequest);

            c1.Run();

        }

        
private static void c1_OnUserRequest(object sender, EventArgs e)

        {
//事件处理方法

            Console.WriteLine(" 你触发了事件!");

        }

    }

    
//定义委托

    public delegate void UserRequest(object sender,EventArgs e);

    
/// 

    
/// 事件发送类

    
/// 


    public class EventSender

    {

        
public EventSender()

        {

        }

        
//定义一个委托类型的事件

        public event UserRequest OnUserRequest;

        
public void Run()

        {

            
while(true)

            {

                
if(Console.ReadLine() == "a")

                {

                    
//事件监听,产生事件

                    OnUserRequest(this,new EventArgs());

                }

            }

        }



    }

}

 

带事件数据的事件示例:



 

ContractedBlock.gifExpandedBlockStart.gifCode

using System;



namespace EventDemo

{

    
/// 

    
/// Summary description for Class1.

    
/// 


    class EventReceiver

    {

        
/// 

        
/// The main entry point for the application.

        
/// 


        [STAThread]

        
static void Main(string[] args)

        {

            EventSender c1 
= new EventSender();

            
//委托实例化后绑定到事件

            c1.OnUserRequest += new UserRequest(c1_OnUserRequest);

            c1.Run();

        }

        
private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)

        {
//事件处理方法

            Console.WriteLine("你触发了事件"+e.InputText);

        }

    }

    
//定义委托

    public delegate void UserRequest(object sender,OnUserRequestEventArgs e);

    
/// 

    
/// 带事件数据的事件类,从EventArgs继承

    
/// 


    public class OnUserRequestEventArgs : System.EventArgs

    {

        
private string _InputText;

        
public string InputText

        {

            
get

            {

                
return _InputText;

            }

            
set

            {

                _InputText 
= value;

            }

        }

    }

    
/// 

    
/// 事件发送类

    
/// 


    public class EventSender

    {

        
public EventSender()

        {

        }

        
//定义一个委托类型的事件

        public event UserRequest OnUserRequest;

        
public void Run()

        {

            
while(true)

            {

                
if(Console.ReadLine() == "a")

                {

                    
//事件监听,产生事件

                    OnUserRequestEventArgs e = new OnUserRequestEventArgs();

                    e.InputText 
= "a";

                    OnUserRequest(
this,e);

                }

            }

        }



    }

}

 

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/05/30/1492442.html

更多相关:

  • addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理...

  • 有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。 ​ 这个例子是关于文章的浏览数的实现,...

  • 1、点击元素,获取绑定该事件的父级元素,使用 e.currentTarget。e.target 获取的是,出发该事件的元素,该元素有可能是所绑定事件的元素的子元素。    2、使用 react router4   history 只能传递给儿子组件,不能传递给孙子组件   如果孙子组件需要,可以通过 props 传递过去    3、关...

  • 1. preventDefault:    比如百度,这是html中最基础的东西,起的作用就是点击百度链接到http://www.baidu.com,这是属于标签的默认行为;preventDefault方法就是可以阻止它的默认行为的发生而发生其他的事情;...

  • Vue组件使用v-on绑定自定义事件:   可以分为3步理解:     1.在组件模板中按照正常事件机制绑定事件:       template: '',       如上,v-on:click就是用来给子组件绑定点击事件的,这就...

  • 关于Graphics也有了基本了解下面想说的的是学这个东东干什么呢,到底如何应用目前常见应用1、验证码(参照网上的)2、打印排版(会提到关于条形码大小设置)3、自定义控件 一、验证码 1 class ValidateCode 2 { 3 #region 定义和初始化配置字段 4...

  •   最近公司在做一个医疗项目,使用WinForm界面作为客户端交互界面。在整个客户端解决方案中。使用了MVP模式实现。由于之前没有接触过该设计模式,所以在项目完成到某个阶段时,将使用MVP的体会写在博客里面。   所谓的MVP指的是Model,View,Presenter。对于一个UI模块来说,它的所有功能被分割为三个部分,分别通过M...

  • 关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体、聚合、值对象的代码,不想多说什么是实体、聚合等概念,相信理论的东西大家已经知晓了。本人对DDD表示好奇,没有在真正项目实践过,甚至也没有看过真正的DDD实践的项目源码,处于极度纠结状态,甚至无法自拔,所以告诫DDD爱好者们,如果要在项目里面实践DD...

  • TPL Dataflow是微软面向高并发应用而推出的新程序库。借助于异步消息传递与管道,它可以提供比线程池更好的控制。本身TPL库在DataflowBlock类中提供了不少扩展函数,用起来还是非常方便的,但感觉还是不够全(当然,MS没必要设计大而全的接口),前段时间写个小程序的时候用到了它,当时顺便写了几个扩展函数,这里记录一下,如果...

  • 前言       写系列文章的时候[前言]部分变得无言了,可能来得顺利了点吧: ) 本章中提供的封装均是我用笨办法从<>和<>中拷贝出来并参照VC++代码进行整理的,主要是针对HikServ...

  • 委托揭秘 编译器和CLR在后台做了很多工作来隐藏委托本身的复杂性,如下一句委托声明: //编译器为我们产生了一个同名的类 public delegate void MyDelegate(int i); 看看IL: 可以看出它默认继承自System.MulticastDelegate[所有委托都继承此类,MulticastDele...