C# 有效地;凌驾;控件。已启用

C# 有效地;凌驾;控件。已启用,c#,winforms,inheritance,controls,overriding,C#,Winforms,Inheritance,Controls,Overriding,我环顾了一下四周,我想不出如何有效地“覆盖”控件的答案。在C#WinForms 3.5中启用 我们的情况是,我们使用一个基本窗体或主窗体,它在底部添加一个状态栏,在顶部添加一个工具栏。此表单将被所有其他表单继承,然后这些表单将控件添加到中心面板 在一些从主基窗体继承的窗体上,我们希望能够在窗体上使用“Enabled”属性,但我们希望能够覆盖函数性,以便它只禁用中心面板,而不禁用状态/菜单栏,从而仍然可以移动窗体 我已尝试在主表(FrmBaseStatus)上执行以下操作: 但是,很明显,这不是真

我环顾了一下四周,我想不出如何有效地“覆盖”控件的答案。在C#WinForms 3.5中启用

我们的情况是,我们使用一个基本窗体或主窗体,它在底部添加一个状态栏,在顶部添加一个工具栏。此表单将被所有其他表单继承,然后这些表单将控件添加到中心面板

在一些从主基窗体继承的窗体上,我们希望能够在窗体上使用“Enabled”属性,但我们希望能够覆盖函数性,以便它只禁用中心面板,而不禁用状态/菜单栏,从而仍然可以移动窗体

我已尝试在主表(FrmBaseStatus)上执行以下操作:

但是,很明显,这不是真正的覆盖,如果我们在继承的表单中的基础面板上有一个用户控件,并且我们希望从该用户控件覆盖表单,那么我们必须执行以下操作:

((FrmBaseStatus)this.ParentForm).Enabled = true;
有没有其他方法可以做到这一点,或者我们一直坚持对基础表单进行强制转换,以达到我们想要使用的已启用属性


注意:重写OnEnabled事件而不调用基本OnEnabled是否会执行此操作,或者在此控件事件中是否未执行启用和禁用操作。OnEnabled()?

控件中的
Enabled
属性用于启用/禁用整个控件,因此,我不明白您为什么需要覆盖父窗体上的
Enabled
属性。如果需要完全禁用centerPanel,请添加属性以获取该面板,然后将其禁用

我建议在基本表单中定义
中心面板
属性,然后使用它禁用该面板:

// code defined in your FrmBaseStatus form
protected Control CenterPanel
{
    get
    {
        return this.panelBase;
    }
}
然后从继承的表单中,您可以使用:

// disable center panel and its childs
this.CenterPanel.Enabled = false;

//disable the whole form
this.Enabled = false;

代码没有什么意义。禁用窗体时,其所有子控件也将被禁用。包括小组。子控件不应用于禁用其父控件。使用事件。您是否尝试在.EnabledChanged中重新启用控件?问题是无法禁用“表单”本身,因为这样您就无法移动它或什么都不可以了。这是一个非常好的主意,可以从用户控件中禁用。但是,如果我从MDI获取所有控件,并希望对它们执行.Enabled=false,这行不通。MDI也不知道FRMBasStatus,因为MDI在插件管理器中,而生成的表单在插件中完成。所有MDI对类“Form”具有可见性,但不具有更高的可见性。请确保在基本窗体的设计器中将CenterPanel.Modifiers属性设置为Protected。否则,您将无法以派生形式向其添加控件。
// disable center panel and its childs
this.CenterPanel.Enabled = false;

//disable the whole form
this.Enabled = false;