事件是消息,如需要传递数据,这样看事件也是数据,是暴露的数据
IPostBackEventHandler
IPostBackDataHandler
发送事件和通知数据仅仅是工作的一半,另一半是客户端为事件及其相关数据进行注册。客户端必须注册接受的事件。
通过.net的委托实现注册。利用委托发送事件。
事件数据类名称事件名称和关键字EventArgs
事件数据需要EventArgs
委托名称将包含EventHandler
用委托实例和关键字event定义事件
public event visitedataEventHandler gvisite;
实现委托
用委托封装该方法
事件委托都是多路广播委托的子集,包括一个称为调用列表的内联列表
this.gvisite += mydelegate;
需要一个受保护的虚方法,调用委托将通知发给客户端。
关于事件优化:
把委托事件定义为一个公共字段,1会浪费系统资源(每个引用都会各自生成)2保证线程安全(大多数不会使用线程)每个事件委托字段生成的add和move方法会产生不必要的开销(会先锁定)。
EventHandlerList类来解决这两个性能问题。
把事件定义成私有静态属性
private static readonly object validCriCardEventKey = new object();
将事件定义为属性,get set用add和remove代替。
调用的方法为 (EventHandlerList Events)
Event.AddHandler
Event.RemoveHandler
Event[validCriCardEventKey]
通过包含页面通知服务器控件。
包含页面
》返回导致回传的HTML元素的name属性值
》检索控件树,查找上述控件的UniqueID
》检测是否实现IpostBackEventHandler接口,接口公开RaisePostBackEvent方法
限定方法和属性使用接口的名称
不使用任何修饰符
调用各个受保护的虚方法
void IPostBackEventHandler.RisePostBackEvent(string s)
{
this.RisePostBackEvent(s);
}
回传数据
IPostBackDataHandler --》LoadPostData
bool IPostBackDataHandler.LoadPostData(string postDataKey,NameValueCollection values)
{
return this.LoadPostData(postDataKey,values);
}
另外实现RaisePostDataEventChanged方法。
protected virtual void RaisePostDataEventChanged()
{
this.RaisePostDataEventChanged();
}
声明事件模式:
namespace CustomComponents2
{3
public class CreditCardForm6 : CreditCardForm5, IPostBackEventHandler,4
IPostBackDataHandler5
{6
private static readonly object PaymentMethodChangedEventKey = new object();7
public event EventHandler PaymentMethodChanged8
{9
add { Events.AddHandler(PaymentMethodChangedEventKey, value); }10
remove { Events.RemoveHandler(PaymentMethodChangedEventKey, value); }11
}12
protected virtual void OnPaymentMethodChanged(EventArgs e)13
{14
EventHandler handler = Events[PaymentMethodChangedEventKey] as EventHandler;15
if (handler != null)16
handler(this, e);17
}18
private static readonly object CreditCardNoChangedEventKey = new object();19
public event EventHandler CreditCardNoChanged20
{21
add { Events.AddHandler(CreditCardNoChangedEventKey, value); }22
remove { Events.RemoveHandler(CreditCardNoChangedEventKey, value); }23
}24
protected virtual void OnCreditCardNoChanged(EventArgs e)25
{26
EventHandler handler = Events[CreditCardNoChangedEventKey] as EventHandler;27
if (handler != null)28
handler(this, e);29
}30
private static readonly object CardholderNameChangedEventKey = new object();31
public event EventHandler CardholderNameChanged32
{33
add { Events.AddHandler(CardholderNameChangedEventKey, value); }34
remove { Events.RemoveHandler(CardholderNameChangedEventKey, value); }35
}36
protected virtual void OnCardholderNameChanged(EventArgs e)37
{38
EventHandler handler = Events[CardholderNameChangedEventKey] as EventHandler;39
if (handler != null)40
handler(this, e);41
}42
private static readonly object ExpirationDateChangedEventKey = new object();43
public event EventHandler ExpirationDateChanged44
{45
add { Events.AddHandler(ExpirationDateChangedEventKey, value); }46
remove { Events.RemoveHandler(ExpirationDateChangedEventKey, value); }47
}48
protected virtual void OnExpirationDateChanged(EventArgs e)49
{50
EventHandler handler = Events[ExpirationDateChangedEventKey] as EventHandler;51
if (handler != null)52
handler(this, e);53
}54
}55
}


