什么是事件?事件有哪些?怎么用事件?
一、什么是事件?
事件(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请输入数字:");
}
}
}
}
}
执行结果如下: