【问题标题】: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 的文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 2018-07-26
        • 2014-09-30
        • 2011-12-16
        • 2017-06-17
        • 1970-01-01
        • 2014-09-11
        相关资源
        最近更新 更多