C# 委托delegate与事件Event的用法和相关知识

什么是事件?事件有哪些?怎么用事件?

一、什么是事件?

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动、输入值改变等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。

比较常用的有:窗体加载事件,鼠标事件,键盘事件,值改变事件,每个事件都有相应的操作响应。


二、事件有哪些?

在C#的命名空间System下,有个EventArgs类,它包含事件数据的类的基类,并提供用于不包含事件数据的事件的值。下面简单总结下常用的事件:

1.窗体加载事件

当我们写Windows窗体应用程序时,经常用到窗体加载事件。双击窗体(举例Form1)上方可以拖动拖动的位置,就会自动在Form1.Designer.cs文件的Form1部分,添加一句

this.Load +=new System.EventHandler(this.Form1_Load); //语句1,

并且在Form1.cs文件里,写好了方法返回值类型,名称,参数等,留下方法体,供我们写具体实现。

        private voidForm1_Load(object sender, EventArgs e)       //要执行的方法
        {
                 //方法体
        }

语句1中,this指的就是当前窗体,.Load就是该窗体的加载事件,EventHandler是一个系统定义好的委托,事件都是通过委托实现的;this.Form1_Load是事件触发后要执行的方法名称。这行代码的意思就是:当窗体加载(弹出)时,执行Form1_Load方法。

使用VS开发工具,选中窗体或窗体的一个控件,在“属性”中,点击事件按钮(一个闪电符号),可以看到该组件拥有的事件,可以在时间后面手动添加绑定事件。

2.     鼠标事件

·MouseClick  在鼠标单击控件时发生

·MouseDoubleClick   在鼠标双击控件时发生。//按钮没有鼠标双击事件

·MouseDown   当鼠标指针在控件上方并按下时发生。//只要按下即触发,与单击不同,单击需要松开

·MouseUp   当鼠标指针在控件上方并释放时发生。

·MouseEnter   在鼠标进入控件的可见部分时发生。//例如:鼠标进入按钮范围,改变按钮的颜色,给出按钮功能提示等

·MouseLeave  在鼠标离开控件的可见部分时发生

·MouseMove   鼠标指针移过组件时发生   //有进有出

·MouseHover  当鼠标在控件内保持静止状态达到一段时间时发生。//Mouse Hang Over,hang-悬停

·MouseCaptureChanged   在鼠标捕获更改后发生     //常用于卡牌游戏,选中牌,或松开选中的牌


3.     键盘事件

·KeyDown   在首次按下某个键时发生

·KeyPress   在控件具有焦点并且按下并释放某个键时发生   //当前焦点必须在该控件上

·KeyUp   在释放键时发生

虽然从字面理解, KeyDown是按下一个键的意思, 但实际上二者的根本区别是, 系统由KeyDown返回键盘的代码, 然后由TranslateMessage函数翻译成成字符, 由KeyPress返回字符值. 因此在KeyDown中返回的是键盘的代码, 而KeyPress返回的是ASCII字符. 所以根据你的目的, 如果只想读取字符, 用KeyPress, 如果想读各键的状态, 用KeyDown. 
说KeyDown是按下, KeyPress是按下并松开, 是不对的. 如果你一直按着键呢? 这时不断地产生KeyDown和KeyPress

说明:如果想对整个Form做键盘事件(如:KeyPress),则选定整个Form并在事件的KeyPress绑定方法;如果想对某个组件做KeyPress,则选定该组件,再绑定方法即可,就是说你想让事件在哪个焦点上起作用,就写在哪个组件的事件里。

4.     其他事件

还有一些事件,比如TextBox的TextChanged事件,size改变事件,datagridview的双击、添加、删除事件,各种背景改变事件等等,VS开发工具上都有列举


三、怎么用事件
事件是通过委托delegate实现的,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。说得简单点,委托是用来执行某个方法的,这个方法与委托有相同的返回值类型和参数。

public delegate void eventHandler(string str);   //声明一个委托eventHandler,无返回值,有一个string参数。所以,该代理要执行的方法也必须是void类型,有一个string参数。

public  event  eventHandler  eatEvent;    //基于上面的委托定义事件eatEvent


下面举个例子,在控制台输入数字,当数字不等时,触发两个事件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace eventLearn20160909
{
    public class EventTest
    {
        private int value;

        public delegate void NumManipulationHandler();  //定义委托NumManipulationHandler

        public event NumManipulationHandler ChangeNum;  //根据委托定义事件ChangeNum

        protected virtual void OnNumChanged()
        {
            if (ChangeNum != null)
            {
                ChangeNum();
            }
            else
            {
                Console.WriteLine("事件触发(1)!");
            }

        }
        protected virtual void OnNumChanged2()
        {
            if (ChangeNum != null)
            {
                ChangeNum();
            }
            else
            {
                Console.WriteLine("事件触发(2)!");
            }

        }
        public EventTest(int n)  //设值
        {
            SetValue(n);
        }
        public void SetValue(int n)   //触发执行
        {
            if (value != n)
            {
                value = n;
                OnNumChanged();
                OnNumChanged2();
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                EventTest e = new EventTest(0);
                Console.WriteLine("请输入数字:");
                while (true)
                {
                    int i = int.Parse(Console.ReadLine());   //读取数字并设值
                    e.SetValue(i);
                    Console.WriteLine("\n请输入数字:");
                }
            }
        }
    }
}

执行结果如下:


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值