2017-03-21 4 views
0

BaseForm.InitializeComponent()で初期化されているいくつかの保護されたコントロールを指定するBaseFormがあります。これらのコントロールを保護して、私のDerivedFormのドロップダウンなどの値にアクセスできるようにしました。これらのコントロールをDerivedFormにアクセスできるようにすると、デザイナーはこれらをDerivedForm.InitializeComponent()にインクルードし、それらをリセットして、BaseFormコンストラクターで行った追加作業を元に戻します。WinForms継承InitializeComponent

DerivedFormのBaseFormコントロールにアクセスする方法はありますか?2回目の初期化はしていませんか?

public SettingsDialogBase(Settings settings) 
    { 
     InitializeComponent(); 

     // Additional work which initializes dropdowns, etc 
     InitializeSettings(); 
    } 

    public SettingsDialog(Settings settings) : base(settings) 
    { 
     InitializeComponent(); 
     // InitializeSettings() rendered useless on controls that are set to protected 
     // because SettingsDialog.InitializeComponent() included them automatically 
    } 
+0

[Windowsフォームの継承]の可能な複製(http://stackoverflow.com/questions/826425/windows-form-inheritance) –

+0

私はそうは思わない。私のBaseFormとDerivedFormはどちらも、独自のInitializeComponent()メソッドを正常に呼び出します。問題は、BaseFormコンストラクターがInitializeComponent()の後のコントロールで追加作業を行い、保護されたコントロールであるためです。DerivedFormは独自のInitializeComponent()メソッドを呼び出すときにすべての作業を元に戻します。 – Danielle

+0

派生クラスのコンストラクタから 'InitializeComponent()'を削除します – Fabio

答えて

1

私は

あなたの問題があるドロップダウンの値にアクセスできるように保護されたこれらのコントロールを行いました。

これらのコントロールを作成しないでください。protectedそれらをprivateのままにしてください。アクセスする必要のあるコントロールの側面はへのアクセスを許可するパブリックプロパティのコントロールへのアクセスをラップすることによって、公開されたとおりにサブクラスに公開してください。例えば

class BaseForm : Form 
{ 
    public string PromptText 
    { 
     get { return textBox1.Text; } 
     set { textBox1.Text = value; } 
    } 

    public int SelectedIndex 
    { 
     get { return comboBox1.SelectedIndex; } 
     set { comboBox1.SelectedIndex = value; } 
    } 

    // etc. 
} 

ComboBoxのようなものは、例えば使用している場合ということenum値を持つ場合は、代わりにSelectedValueのようなプロパティを作成し、列挙型を持ち、comboBox1.SelectedValueプロパティから返すときにキャストすることができます。

このタイプの設計問題にアプローチするもう1つの方法は、フォームの代わりにUserControlオブジェクトを作成し、構成を使用してタスク固有のフォームを構築することです。これにより、継承が完全に回避されます。

+0

私がアクセスしようとしているフィールドの大部分はコンボボックスコントロールです。また、[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]をGroupBoxのような他のコントロールに追加すると、DerivedForm.InitializeComponent()であまりにも狂ってしまうのを防ぐことができたようです – Danielle

0

InitializeSettingsのベースフォームの実装:InitializeSettingsの

protected virtual void InitializeSettings(Settings settings) 
{ 
    //initialization of settings 
} 

DerivedFormの実装:InitializeSettingsの

protected override void InitializeSettings(Settings settings) 
{ 
    base.InitializeSettings(x); 
    //reinitialization of settings 
} 

と呼び出し()あなたのDerivedFormのコンストラクタでは、あなたの設定をします。

さて、私の目標は明らかではありませんでした。

設定の初期化を1つだけにしたい場合は、コンストラクターに適用しないでください。基本的に、あなたは問題を解決するための第二の方法でもパラメータ化コンストラクタを持たないために、デフォルトコンストラクタによってフォームの作成後に外InitializeSettingsを呼び出すことです

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    //initialization of settings 
} 

を使用する必要があります。

+0

私のコンポーネントはまだ2回初期化されていますが、それを補うために設定が2回初期化されていますか?私は実際にコンポーネントと設定の初期化が一度行われるソリューションを探しています。具体的には、BaseFormはそのコンポーネントを初期化し、DerivedFormはそのコンポーネントのみを初期化し、保護されたBaseFormコンポーネントは初期化しません。 – Danielle

+0

私はあなたのコメントに応じて私の答えを更新しました – S0zidatel