事件
在Windows Forms程序中,几乎用户的大多数都将操作都将产生Windows事件,如按一个按钮引发一个点击(Click),用户移动鼠标有相应鼠标移动的事件等;有一些事件是不是用户操作产生而是系统自动产生的,如数据库链接断开、时间到达某一时刻或是使用外设时未就绪等。
在Windows Forms中,每一个Windows控件有非常多的事件使其可以达到与用户交互,事件的监视及管理是由前面所说Application类负责的。在产生一个事件时一般经引发一系列操作,如点击“刷新”按钮使用程序重新从读取数据库中的数据、点击窗体上的关闭图标将关闭窗口或退出程序等。程序员就是通过书写事件的响应方法(即事件所引发的操作)来达到对程序的控制及交互。
在.Net中,事件的声明是通过event(事件)关键字来声明的,事件是一个类的成员之一。
.Net中,事件的响应及处理是通过一个新的数据类型delegate(代表)来处理的,delegate(代表)非常类似于C/C++的函数指针,但不同的是, delegate(代表)是安全的、受管理的。
如下面分别用三种语言声明一个控件Click事件的代码:
public event EventHandler Click; [C#]
Public Event Click As EventHandler [Visual Basic]
public: __event EventHandler* Click; [C++] |
在上面的代码中,EventHandler是一个代表类型,其在.Net类库中的声明如下:
public delegate void EventHandler(object sender,EventArgs e); [C#] Public Delegate Sub EventHandler(ByVal sender As Object,ByVal e As EventArgs) [Visual Basic] public __gc __delegate void EventHandler(Object* sender,EventArgs* e); [C++] |
事件响应方法 由于事件是解释及管理是由Application对象进行的,程序员不需要知道用户何时响应事件或者是响应了什么事件,只需要为事件添加响应方法即可。通过使用delegate(代表),你可以使用“+=”(加等于)操作符非常容易地为.Net类中的一个事件添加一个甚至多个响应方法,还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。如下面,我们为一个按钮的Click事件添加响应方法的代码:
button1.Click += new System.EventHandler(MyMethod); |
其中,MyMethod函数的定义如下:
void MyMethod(object sender, System.EventArgs e); |
这样当用户点击按钮或者是其它方法引发其Click事件时,MyMethod函数中的代码将执行。