2011-10-28 2 views
4

私はちょっと見回しましたが、C#WinForms 3.5でControl.Enabledを効果的に "オーバーライド"する方法について、私は答えを思いつくことができません。効果的に "Override" 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; 

か、我々は常に到達するために、当社の基本フォームにキャストして立ち往生している:フォームは、我々は我々のような何かをする必要があり、このユーザーコントロールからフォームを上書きしたいです使用する有効なプロパティ。

注:OnEnabledイベントをオーバーライドし、OnEnabledベースを呼び出さないか、これを行うか、Control.OnEnabled()のこのイベントで有効化と無効化を行いますか?

+0

コードになりをほとんど意味がありません。フォームを無効にすると、その子コントロールもすべて無効になります。パネルを含む。子供のコントロールは、両親を無効にするビジネスではありません。イベントを使用する。 –

+0

.EnabledChangedでコントロールを再び有効にしましたか? –

+0

問題は「フォーム」自体を無効にすることができないため、それを回避することはできません。 – copystart

答えて

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; 
+2

これは非常に良い考えであり、ユーザーコントロールから無効にするためには機能しますが、MDIからすべてのコントロールを取得し、その上で.Enabled = falseを実行したい場合、これは機能しません。また、MDIはFrmBaseStatusについて知らない。なぜなら、スポーンされたフォームがプラグイン内で実行されている間に、MDIがプラグインマネージャにあるからです。すべてのMDIは、クラス "フォーム"であり、それ以上のレベルではありません。 – copystart

+0

CenterPanel.Modifiersプロパティをベースフォームのデザイナで[保護]に設定していることを確認してください。そうしないと、派生フォームでコントロールを追加することができなくなります。 – djv