我看了一下,我无法想出如何有效地“覆盖”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()的此事件中未启用和禁用?
解决方法:
控件中的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;