自定义服务器控件开发(2)--事件和事件处理
委托:
委托是一种引用方法的类型。一旦为委托分配了方法,那么该委托将与该方法具有完全相同的行为。如:
public delegate int
PerformCalculation(int x, int y);
委托是一种安全地封装方法的类型,它是面向对象的,构造委托对象时,通常提供委托将包装的方法的名称或使用匿名方法。实例化委托后,委托将把它进行的方法调用传递给方法。调用方法传递给委托的参数被传递给方法,来自方法的返回值由委托返回给调用方。这被成为调用委托。如:
public delegate void Del(string message);
// Create a
method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
// Instantiate
the delegate.
Del handler =
DelegateMethod;
// Call the
delegate.
handler("Hello World");
由于实例化的委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性,这样,方法便可以将一个委托作物参数来接受,并且以后可以调用该委托。这就是异步回调,是在较长的进程完成后用来通知调用方的常用方法。如:
public void
MethodWithCallback(int param1, int param2, Del callback)
{
callback("The number is: " + (param1 + param2).ToString());
}
//然后可以将上面创建的委托传递给该方法
MethodWithCallback(1,
2, handler);
结果将出现:
The number is: 3
事件:
用event关键字和指示方法签名的委托对象来定义事件,如:
Public event EventHandler Click;
我们已经定义了事件,指定了所使用的委托类型,但是还没有引发这个事件,根据约定,引发事件的行为在OnEventName方法中发生。如:
Protect void OnClick()
{
If(Click
!= null)
{
Click(this,new
EventArgs());
}
}
先进行检查,以确定存在事件的观测程序,接着像调用方法易于调用事件来引发它,把对控件或类的this引用传递给它,指示它是事件的发送者,把一个EventArgs类的新实例作为第二个参数。
使用事件:
声明了事件和它的相应委托后,可以添加一个事件处理程序,它的签名和与事件关联的委托匹配,当事件被引发时被调用。如:
Object.EventName += new
DelegateType(EventHandlerMethod);
Button1.Click += new
EventHandler(CustomButton_Click);
Public void CustomButton_Click(object
sender,EventArgs e)
{
}
Asp.net控件中的事件:
表单数据提交给页面,数据以名-值的方式被发送,通过HttpRequest访问Form对象来访问这个信息。在服务器上采用同样的信息来处理事件。所有的表单数据都传递给服务器,包括viewstate域。
为了处理要提交给页面的数据,控件要遵循一定的原则。对于要求能够判断状态在请求之间何时修改的控件,有一个接口IPostBackDataHandler,实现这个接口的控件可以检查提交给页面的数据并确定数据是否在客户端修改过。LoadPostData定义了两个方法:
Public bool LoadPostData(string
postDataKey,NameValueCollection postData)
Public void RaisePostDataChangedEvent();
当LoadPostData方法在控件上实现的时候,被用来检查提交给页面的数据。第二个参数是提交给页面的集合,是一个参数为key,因此,要访问集合中的控件数据,需要使用下面的代码:
String newData = postData[postDataKey];
在这个方法中,检查发送的数据值与已经提交给客户端的数据值进行比较,如果修改,则返回true,否则返回false。如果返回的是true,则调用RaisePostDataChanged-
Event方法,这样控件可以根据数据的变化引发相应的事件,在OnEvent方法来引发事件。如:
Public void RaisePostDataChangedEvent()
{
OnClick();
}
测试页面: