我有一个基地UserControl(BaseControl.cs),它有一个确定和取消按钮。点击按钮时,会触发一个事件。通常,其他UserControl对象从BaseControl继承。最后,后代UserControl对象被放置在WinForm中,在那里它们钩入用于点击Ok/Cancel按钮的事件。后代UserControl如何拦截由其基类触发的事件?
我的问题是这样的:在后代控件中,我想拦截事件(运行一些验证)。如何钩住(或拦截)这些事件?
谢谢。
我有一个基地UserControl(BaseControl.cs),它有一个确定和取消按钮。点击按钮时,会触发一个事件。通常,其他UserControl对象从BaseControl继承。最后,后代UserControl对象被放置在WinForm中,在那里它们钩入用于点击Ok/Cancel按钮的事件。后代UserControl如何拦截由其基类触发的事件?
我的问题是这样的:在后代控件中,我想拦截事件(运行一些验证)。如何钩住(或拦截)这些事件?
谢谢。
执行事件的标准模式是利用一个虚拟的“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”方法。我真的不知道这样做的好方法,我相信大多数人会忽视这个指导方针。
您通常会创建一个protected virtual Validate()
方法,该方法在BaseControl的事件处理程序中调用。然后在DescendantControl中,你会使用override
的Validate()
方法。
以下是关于Inheritance的一些文档。