【问题标题】:Effectively "Override" Control.Enabled有效地“覆盖” Control.Enabled
【发布时间】:2011-12-17 04:49:00
【问题描述】:

我环顾四周,无法找到关于如何在 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() 的此事件中未完成启用和禁用?

【问题讨论】:

  • 代码意义不大。当您禁用表单时,它的所有子控件也会被禁用。包括面板。子控件不应用于禁用其父控件。使用事件。
  • 您是否尝试在 .EnabledChanged 中重新启用您的控件?
  • 问题是“表单”本身不能被禁用,因为你不能移动它或者什么都没有。

标签: c# winforms inheritance controls overriding


【解决方案1】:

控件中的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;

【讨论】:

  • 这是一个非常好的主意,它可以用于禁用用户控件但是如果我从 MDI 获取所有控件并想要对它们执行 .Enabled = false ,这将不起作用.此外,MDI 不知道 FrmBaseStatus,因为 MDI 在插件管理器中,而生成的表单是在插件内完成的。所有 MDI 的可见性都是“Form”类,没有更高级别。
  • 确保在基本表单的设计器中将 CenterPanel.Modifiers 属性设置为 Protected。否则,您将无法以派生形式向其添加控件。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2014-12-13
  • 2020-03-01
相关资源
最近更新 更多