Welcome 微信登录

首页 / 网页编程 / ASP.NET / 庖丁解牛Asp.net3.5控件和组件开发技术系列—事件和数据回发机制(二)

庖丁解牛Asp.net3.5控件和组件开发技术系列—事件和数据回发机制(二)2011-05-09 MSDN 郑健5.2.4 正确处理继承基类中控件的事件

在5.2.3.3节中讲的KingTextBox事件中,定义事件的功能语句如下:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}
protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}

上面代码中的 RaisePostDataChangedEvent方法首先调用了OnTextChanged,然后OnTextChanged才真正调用 TextChanged(this,e)事件。看上去有些啰唆,如果把OnTextChanged方法去掉,修改后的代码如下所示:

public virtual void RaisePostDataChangedEvent()
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}

看上去比较简练,但这种写法对于继承此控件的控件,处理基类中事件有些限制。说明原因之前,得先说一下本节的主题,如何处理基类中继承的事件。

若要处理继承的事件,需要重写从基类继承的受保护的OnEventName方法,而不要附加委托,附加委托不能保证基类中默认的逻辑能够执行。一般情况下,重写的方法应该调用基类的OnEventName方法,以确保调用附加到事件的委托(除非不想调用这些委托)。

下面从代码角度理解上面这段含义,这里还是以OnTextChanged方法为例说明,在OnTextChanged(即上面提到的OnEventName)方法中会调用默认的事件:

protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}