有效地“覆盖”Control.Enabled

时间:2011-10-28 10:24:13

标签: c# winforms inheritance controls override

我看了一下,我无法想出如何有效地“覆盖”C#WinForms 3.5中的Control.Enabled。

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

在从主基础表单继承的某些表单上,我们希望能够在表单上使用“已启用”属性,但我们希望能够覆盖功能,因此它只会禁用中心面板而不是状态/菜单栏,因此它仍然可以移动表单。

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

private bool enabled = true;
public new bool Enabled
{
    return this.enabled;
}
set
{
    this.enabled = value;
    this.panelBase.Enabled = value;
}

然而,显然这不是真正的覆盖,如果我们在一个继承的表单中的基本面板上有用户控件,并且我们想要覆盖此用户控件的表单,我们必须执行以下操作:

((FrmBaseStatus)this.ParentForm).Enabled = true;

有没有其他方法可以做到这一点,或者我们是否总是强制转换到我们的基本表单以便达到我们想要使用的Enabled属性。?

注意:覆盖OnEnabled事件并且不调用基础OnEnabled会执行此操作,还是在Control.OnEnabled()的此事件中未启用和禁用?

1 个答案:

答案 0 :(得分:4)

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

我建议您在基本表单中定义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;
相关问题