后代UserControl如何拦截其基类触发的事件?

时间:2009-01-20 22:41:13

标签: visual-studio-2008 inheritance user-controls

我有一个基本UserControl(BaseControl.cs),上面有一个OK和Cancel按钮。单击按钮时,将触发事件。通常,其他UserControl对象继承自BaseControl。最后,将后代UserControl对象放在WinForm上,然后将它们挂钩到事件中以单击“确定/取消”按钮。

我的问题是:在后代控件中,我想拦截事件(运行一些验证)。如何挂钩(或拦截)这些事件?

感谢。

2 个答案:

答案 0 :(得分:4)

实现事件的标准模式是使用虚拟的“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”方法,即使后代类忘记调用基本方法也会触发事件。我真的不知道这样做的好办法,我相信大多数人都会忽视这个指南。

答案 1 :(得分:0)

您通常会创建一个protected virtual Validate()方法,该方法在BaseControl的事件处理程序中调用。然后在DescendantControl中override使用Validate()方法。

以下是Inheritance的一些文档。