効果的に "オーバーライド" Control.Enabled

私はちょっと見渡しましたが、C#WinForms 3.5でControl.Enabledを効果的に "オーバーライド"する方法の答えを思いつくことはできません。

私たちの状況は、私たちが使用するベースフォームまたはマスターフォームがあり、下部にステータスバーが、上部にツールバーが追加されています。このフォームは他のすべてのフォームに継承され、センターパネルにコントロールが追加されます。

マスターベースフォームを継承したフォームの中には、フォーム上の "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()のこのイベントで有効化と無効化を行いますか?

4
コードはほとんど意味がありません。フォームを無効にすると、その子コントロールもすべて無効になります。パネルを含む。子供のコントロールは、親を無効にするビジネスに参加してはなりませんない。イベントを使用する。
追加された 著者 Hans Passant,
.EnabledChangedでコントロールを再び有効にしましたか?
追加された 著者 Stephan B,
問題は、 "フォーム"自体を無効にすることができないため、それを回避することはできません。
追加された 著者 copystart,

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;
4
追加された
ベースフォームのデザイナーでCenterPanel.ModifiersプロパティをProtectedに設定していることを確認してください。そうしないと、派生フォームでコントロールを追加することができなくなります。
追加された 著者 djv,
これは非常に良いアイデアですが、MDIからすべてのコントロールを取得し、その上で.Enabled = falseを実行したい場合、ユーザーコントロールから無効にすると機能しますが、これは機能しません。また、MDIはFrmBaseStatusについて知らない。なぜなら、スポーンされたフォームがプラグイン内で実行されている間に、MDIがプラグインマネージャにあるからです。すべてのMDIは、クラス "フォーム"であり、それ以上のレベルではありません。
追加された 著者 copystart,