读书笔记——asp.net 2.0 服务器组件和控件高级编程0627

事件是消息,如需要传递数据,这样看事件也是数据,是暴露的数据
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();
 }

声明事件模式:


 1 namespace  CustomComponents
 2 {
 3public class CreditCardForm6 : CreditCardForm5, IPostBackEventHandler,
 4IPostBackDataHandler
 5{
 6private static readonly object PaymentMethodChangedEventKey = new object();
 7public event EventHandler PaymentMethodChanged
 8{
 9add { Events.AddHandler(PaymentMethodChangedEventKey, value); }
10remove { Events.RemoveHandler(PaymentMethodChangedEventKey, value); }
11}

12protected virtual void OnPaymentMethodChanged(EventArgs e)
13{
14EventHandler handler = Events[PaymentMethodChangedEventKey] as EventHandler;
15if (handler != null)
16handler(this, e);
17}

18private static readonly object CreditCardNoChangedEventKey = new object();
19public event EventHandler CreditCardNoChanged
20{
21add { Events.AddHandler(CreditCardNoChangedEventKey, value); }
22remove { Events.RemoveHandler(CreditCardNoChangedEventKey, value); }
23}

24protected virtual void OnCreditCardNoChanged(EventArgs e)
25{
26EventHandler handler = Events[CreditCardNoChangedEventKey] as EventHandler;
27if (handler != null)
28handler(this, e);
29}

30private static readonly object CardholderNameChangedEventKey = new object();
31public event EventHandler CardholderNameChanged
32{
33add { Events.AddHandler(CardholderNameChangedEventKey, value); }
34remove { Events.RemoveHandler(CardholderNameChangedEventKey, value); }
35}

36protected virtual void OnCardholderNameChanged(EventArgs e)
37{
38EventHandler handler = Events[CardholderNameChangedEventKey] as EventHandler;
39if (handler != null)
40handler(this, e);
41}

42private static readonly object ExpirationDateChangedEventKey = new object();
43public event EventHandler ExpirationDateChanged
44{
45add { Events.AddHandler(ExpirationDateChangedEventKey, value); }
46remove { Events.RemoveHandler(ExpirationDateChangedEventKey, value); }
47}

48protected virtual void OnExpirationDateChanged(EventArgs e)
49{
50EventHandler handler = Events[ExpirationDateChangedEventKey] as EventHandler;
51if (handler != null)
52handler(this, e);
53}

54}

55}

你可能感兴趣的:(asp.net)