2009-01-20 64 views
3

我有一个基地UserControl(BaseControl.cs),它有一个确定和取消按钮。点击按钮时,会触发一个事件。通常,其他UserControl对象从BaseControl继承。最后,后代UserControl对象被放置在WinForm中,在那里它们钩入用于点击Ok/Cancel按钮的事件。后代UserControl如何拦截由其基类触发的事件?

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

谢谢。

回答

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”方法。我真的不知道这样做的好方法,我相信大多数人会忽视这个指导方针。

0

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

以下是关于Inheritance的一些文档。