【问题标题】:How can a descendant UserControl intercept events fired by its base class?后代 UserControl 如何拦截由其基类触发的事件?
【发布时间】:2009-01-20 22:41:13
【问题描述】:
我有一个基本的 UserControl (BaseControl.cs),上面有一个确定和取消按钮。单击按钮时,会触发一个事件。通常,其他 UserControl 对象从 BaseControl 继承。最后,后代 UserControl 对象被放置在 WinForm 上,在那里它们挂钩到单击确定/取消按钮的事件。
我的问题是:在后代控件中,我想拦截事件(以运行一些验证)。如何挂钩(或拦截)这些事件?
谢谢。
【问题讨论】:
标签:
visual-studio-2008
inheritance
user-controls
【解决方案1】:
实现事件的标准模式是使用虚拟的“OnXxx”方法,如下所示:
public event EventHandler OkClick;
protected virtual void OnOkClick(EventArgs e)
{
if (OkClick != null) OkClick(this, e);
}
现在,只要您的基本控件想要触发“OkClick”事件,它只需调用:
OnOkClick(EventArgs.Empty);
这意味着您的基本控件的后代可以像这样覆盖 OnOkClick:
protected override void OnOkClick(EventArgs e)
{
// do some stuff before the event is fired
base.OnOkClick(e);
// do some stuff after the event is fired
}
请注意,框架设计指南实际上声明您应该以这样一种方式实现“OnXxx”方法,即即使后代类忘记调用基方法也会触发事件。我真的不知道有什么好的方法可以做到这一点,而且我相信大多数人都忽略了这个指南。
【解决方案2】:
您通常会创建一个protected virtual Validate() 方法,该方法在 BaseControl 的事件处理程序中被调用。然后在 DescendantControl 中 override Validate() 方法。
这里有一些关于 Inheritance 的文档。