首页 > 解决方案 > 如果继承的表单订阅了 Show 事件,我可以在父表单中知道吗?

问题描述

我的 winforms 框架中有以下表格

现在应用程序中的每个表单都继承自上述 3 个表单之一。
例如FormCustomerList将继承自FormBaseList

现在FormBaseList事件FormBaseList_Shown存在(通过在 VS 的属性窗口中双击它)

我想在代码中知道FormBaseList_Show是否存在事件FormCustomerList_Show(再次在属性窗口中双击它)。

这甚至可能吗?

那我为什么要这个?
因为框架中的某些更改要求表单不再使用Shown事件,而是使用自定义事件。
如果他向表单添加事件,我想捕捉并向开发人员显示警告,Show如果确实需要,他可以设置一个隐藏此警告的属性。
这个警告不需要在设计时显示,在运行时就足够了。但是,如果它在设计时可能,那将是一个奖励。
那么这可以做到吗,是否有更好的方法来做到这一点?

我希望这个解释清楚

编辑

这个想法是,当开发人员使用 Show 事件时,他必须得到警告(在设计时或运行时)。如果他觉得他真的需要 Show 方法,他应该能够为这个特定的表单设置警告

标签: c#winformsinheritancevisual-inheritance

解决方案


您应该以Shown这种方式隐藏事件并弃用它:

[Obsolete("Shown event is deprecated.")]
public new event EventHandler Shown
{
    add { base.Shown += value; }
    remove { base.Shown -= value; }
}

您已将其标记为过时,当您构建解决方案时,它会在编译时在错误列表窗口中显示警告。

此外,通过订阅Shown基地的原始事件,该事件将继续按预期工作。

要禁用警告,请在已订阅事件的表单的 Designer.cs 文件顶部添加以下代码行:

#pragma warning disable CS0618 // Type or member is obsolete

并将这一行添加到底部:

#pragma warning restore CS0618 // Type or member is obsolete

注意:在除designer.cs 文件之外的其他文件中,仅将事件处理程序订阅用. 包围就足够了#pragma。但是对于designer.cs,您不能围绕事件处理程序订阅,因为通过更改设计器中的任何内容,InitializeComponent定义成员变量的内容和代码块将自动生成,并且您在designer.cs中的所有手动更改都将丢失. 但是如果你放在#pragma文件的顶部和底部,它是安全的,不会从 Designer.cs 中删除。


推荐阅读