请举几个简单的例子讲讲事件怎莫用。
事件就是当你对应用进行相关操作的时候,系统报告给控件当前发生事情。
对它的操纵,通常就是对事件进行编程,具体的编程方法你可以在控件的事件属性中双击相关的属性后,系统会自动绑定事件到方法,你只要在方法中输入自己处理的代码就一切都OK了。
你是指普通的调用事件,还是真正的写“事件”
以下程序沒有調試﹐但基本上是事件的典型用法﹔但有可能大家不喜歡
自己定義事件參數。伙建議養成這個習慣。
-----------------------------------------
//聲明事件代表
public delegate void myEventHandler(object sender,
ChangeEventArgs e);
//事件參數類型
public class ChangeEventArgs:System.EventArgs
{ .... }
//宿主類
public class myProducer
{
public event myEventHandler Changing;
....
//一旦調用這個方法就印發事件﹐e可以=null
protected void OnChange(ChangeEventArgs e) {
...
if(Changing!=null)
Changing(this,e); //印發事件的方法
}
}
//事件訂閱類
public class myConsumer{
myProducer producer;
public myConsumer(){
producer=new myProducer();
producer.Changing+=new myEventHandler(callbackProc);
}
void callbackProc(object sender,ChangeEventArgs e)
{
Debug.Assert("my call back is running!")
}
}
event 关键字使您得以指定当代码中的某些“事件”发生时调用的委托。此委托可以有一个或多个关联的方法,当代码指示该事件已发生时将调用关联的方法。可使一个程序中的事件用于将 .NET 框架公共语言运行库作为目标的其他程序。
为了创建并使用 C# 事件,必须采取以下步骤:
创建或标识一个委托。如果正在定义自己的事件,还必须确保有与事件关键字一起使用的委托。如果已经预定义了事件,则事件的使用者只需要知道委托的名称。
创建一个类,包含:
从委托创建的事件。
验证用 event 关键字声明的委托实例是否存在的方法。否则,该逻辑必须放置在引发此事件的代码中。
调用此事件的方法。这些方法可以重写一些基类功能。
此类定义事件。
定义一个或多个将方法连接到事件的类。所有这些类都包括:
使用 += 运算符和 -= 运算符将一个或多个方法与基类中的事件关联。
将与事件关联的方法的定义。
使用此事件:
创建包含事件声明的类对象。
使用定义的构造函数,创建包含事件定义的类对象。
有关事件的更多信息,请参阅:
10.7 事件
事件教程
事件和委托
示例
定义和使用事件的基本示例可在事件教程中找到。本主题中的以下示例也对事件进行了说明。
示例 1 在接口中声明事件并在类中实现它。
示例 2 使用哈希表存储事件实例。
示例 3 通过事件属性,实现具有同名事件的两个接口。
示例 1
该示例显示可以在接口中声明一个事件并在类中实现它。
// event_keyword.cs
using System;
public delegate void MyDelegate(); // delegate declaration
public interface I
{
event MyDelegate MyEvent;
void FireAway();
}
public class MyClass: I
{
public event MyDelegate MyEvent;
public void FireAway()
{
if (MyEvent != null)
MyEvent();
}
}
public class MainClass
{
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static public void Main ()
{
I i = new MyClass();
i.MyEvent += new MyDelegate(f);
i.FireAway();
}
}
示例 2
accessor-declarations 的用途之一是公开大量的事件但不为每个事件分配字段,而是使用哈希表存储这些事件实例。这只有在有非常多的事件且预期大部分事件都不实现时才有用。
// event_keyword2.cs
using System;
using System.Collections;
public delegate void MyDelegate1(int i);
public delegate void MyDelegate2(string s);
public delegate void MyDelegate3(int i, object o);
public delegate void MyDelegate4();
public class PropertyEventsSample
{
private Hashtable eventTable = new Hashtable();
public event MyDelegate1 Event1
{
add
{
eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value;
}
remove
{
eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value;
}
}
public event MyDelegate1 Event2
{
add
{
eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value;
}
remove
{
eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value;
}
}
public event MyDelegate2 Event3
{
add
{
eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value;
}
remove
{
eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value;
}
}
public event MyDelegate3 Event4
{
add
{
eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value;
}
remove
{
eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value;
}
}
public event MyDelegate3 Event5
{
add
{
eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value;
}
remove
{
eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value;
}
}
public event MyDelegate4 Event6
{
add
{
eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value;
}
remove
{
eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value;
}
}
}
public class MyClass
{
public static void Main()
{
}
}
示例 3
事件属性的另一个用途涵盖了实现两个接口的情形,其中每个接口都有一个同名事件。在这种情况下,必须使用显式实现事件属性:
// event_keyword3.cs
using System;
public delegate void MyDelegate1();
public interface I1
{
event MyDelegate1 MyEvent;
}
public delegate int MyDelegate2(string s);
public interface I2
{
event MyDelegate2 MyEvent;
}
public class ExplicitEventsSample: I1, I2
{
public event MyDelegate1 MyEvent; // normal implementation of I1.MyEvent.
event MyDelegate2 I2.MyEvent // explicit implementation of I2.MyEvent
{
add
{
MyEvent2Storage += value;
}
remove
{
MyEvent2Storage -= value;
}
}
private MyDelegate2 MyEvent2Storage; // underlying storage for I2.MyEvent.
private void FireEvents()
{
if (MyEvent != null)
MyEvent();
if (MyEvent2Storage != null)
MyEvent2Storage("hello");
}
}
public class MyClass
{
public static void Main()
{
}
}