C#中可以在运行时给对象添加事件处理方法的
方法是
[ObjectName].[EventName]+=new [EventHandler(HandleFunctionName)]
object=对象的名(类的实例名)
EventName=事件名
EventHandler=事件处理函数的委托名
HandleFunctionName=处理函数名称
比如给当前窗体添加Load处理函数
this.Load += new System.EventHandler(this.FormLoadHandleFunction)
FormLoadHandleFunction是定义在其他地方的处理函数,参数表必须和委托一致
private void FormLoadHandleFunction(object sender, System.EventArgs e)
{
//you can do something useful here
}
比如添加SpeechLib.SpVoice的实例vox的StartStream事件处理函数
vox.StartStream+=new SpeechLib.StartStreamEventHandle(this.MyHandleFunction)
这里StartStreamEventHandle是处理StartStream事件的委托类型
MyHandleFunction是自己的处理函数添加处理函数这一句可以在运行时需要的时候添加
(比如Form_Load)
方法是
[ObjectName].[EventName]+=new [EventHandler(HandleFunctionName)]
object=对象的名(类的实例名)
EventName=事件名
EventHandler=事件处理函数的委托名
HandleFunctionName=处理函数名称
比如给当前窗体添加Load处理函数
this.Load += new System.EventHandler(this.FormLoadHandleFunction)
FormLoadHandleFunction是定义在其他地方的处理函数,参数表必须和委托一致
private void FormLoadHandleFunction(object sender, System.EventArgs e)
{
//you can do something useful here
}
比如添加SpeechLib.SpVoice的实例vox的StartStream事件处理函数
vox.StartStream+=new SpeechLib.StartStreamEventHandle(this.MyHandleFunction)
这里StartStreamEventHandle是处理StartStream事件的委托类型
MyHandleFunction是自己的处理函数添加处理函数这一句可以在运行时需要的时候添加
(比如Form_Load)
C# 语言规范 10.7 事件
事件是使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为事件附加可执行代码。事件是使用事件声明声明的: 事件声明:
属性可选 事件修饰符可选 event 类型 变量声明符 ;
属性可选 事件修饰符可选 event 类型 成员名称 { 事件访问器声明 }
事件修饰符:
事件修饰符
事件修饰符 事件修饰符
事件修饰符:
new
public
protected
internal
private
static
virtual
sealed
override
abstract
extern
事件访问器声明:
添加访问器声明 移除访问器声明
移除访问器声明 添加访问器声明
添加访问器声明:
属性可选 add 块
移除访问器声明:
属性可选 remove 块
事件声明可包含一组属性(第 17 节)和四个访问修饰符(第 10.2.3 节)的有效组合、new(第 10.2.2 节)、static(第 10.5.2 节)、virtual(第 10.5.3 节)、override(第 10.5.4 节)、sealed(第 10.5.5 节)、abstract(第 10.5.6 节)以及 extern(第 10.5.7 节)修饰符。关于有效的修饰符组合,事件声明与方法声明(第 10.5 节)遵循相同的规则。事件声明可以包含事件访问器声明。但是,如果它没有包含,编译器会自动提供它们。省略事件访问器声明的事件声明定义一个或多个事件——每个变量声明符一个事件。属性和修饰符适用于所有由这样的事件声明声明的成员。事件声明既包含 abstract 修饰符又包含事件访问器声明是编译时错误。当事件声明包含 extern 修饰符时,称该事件为外部事件。因为外部事件声明不提供任何实际的实现,所以它既包含 extern 修饰符又包含事件访问器声明是编译时错误。事件声明的类型必须是委托类型(第 4.2 节),而该委托类型必须至少具有与事件本身一样的可访问性(第 3.5.4 节)。事件可用作 += 和 -= 运算符(第 7.13.3 节)的左边操作数。这些运算符用于将事件处理程序附加到事件或从事件移除,而事件的访问修饰符控制允许此类操作的上下文。由于 += 和 -= 是仅有的允许在声明事件的类型外部对事件进行的操作,外部代码可以为事件添加和移除处理程序,但是不能以其他任何方式获取或修改基础的事件处理程序列表。在包含事件声明的类或结构的程序文本内,某些事件可以像字段一样使用。若要以这样的方式使用,事件不得是抽象的,而且不能明确包含事件访问器声明。此类事件可以用在任何允许使用字段的上下文中。在下面的示例中,public delegate void EventHandler(object sender, EventArgs e);
public class Button: Control
{
public event EventHandler Click;
protected void OnClick(EventArgs e) {
if (Click != null) Click(this, e);
}
public void Reset() {
Click = null;
}
}
Click 在Button 类中用作一个字段。如示例所说明的,字段可以被检查、修改和用在委托调用表达式中。Button 类中的 OnClick 方法“引发”Click 事件。引发事件的概念与调用由事件表示的委托完全等效——因此,没有用于引发事件的特殊语言构造。请注意,在委托调用之前有一个确保委托是非 null 的检查。在 Button 类的声明外,Click 成员只能用在 += 和 -= 运算符的左边,如b.Click += new EventHandler(...);
将一个委托追加到 Click 事件的调用列表,而b.Click -= new EventHandler(...);
则从 Click 事件的调用列表中移除一个委托。在 x += y 或 x -= y 形式的操作中,当 x 为一个事件而引用发生在包含 x 的声明的类型外部时,操作的结果具有类型 void(与 x 的类型相对)。此规则禁止外部代码以间接方式检查事件的基础委托。下列示例显示如何将事件处理程序附加到上面的 Button 类的实例:public class LoginDialog: Form
{
Button OkButton;
Button CancelButton;
public LoginDialog() {
OkButton = new Button(...);
OkButton.Click += new EventHandler(OkButtonClick);
CancelButton = new Button(...);
CancelButton.Click += new EventHandler(CancelButtonClick);
}
void OkButtonClick(object sender, EventArgs e) {
// Handle OkButton.Click event
}
void CancelButtonClick(object sender, EventArgs e) {
// Handle CancelButton.Click event
}
}
此处,LoginDialog 的实例构造函数创建两个 Button 实例并将事件处理程序附加到 Click 事件。
双击就可以声明事件了!