none
基底Form上にあるコントロールの値を、派生Formのコンストラクタで設定したい。 RRS feed

  • 質問

  • Windows Formの画面を複数作る必要があり、共通する部分は基底Formとして配置し、それを継承して派生Formのデザインを行っています。

    共通する部分は、例えば、ステータスバーとして、「StatusStrip」と「ToolStripStatusLabel」を配置しています。

    ここで例えば、基底Form上のToolStripStatusLabelのTextに「基底テキスト」としていると、

    派生Formのコンストラクタで基底Form上のToolStripStatusLabelのTextに「派生テキスト」とセットしても反映されず「基底テキスト」のままになっています。

    おそらく、処理の順番が派生Formのコンストラクタが実行されたあとに基底のFormのコントロールに設置した値で上書きしているせいで、反映されないようになっているのではないかと考えました。

    Form_Loadイベントで設定してしまえば解決するとは思うのですが、現在実装しているコードが少し煩雑になるので、できればコンストラクタ内で実装したいと考えてます。

    何か対処策があれば教えて下さい。

    2014年1月31日 21:24

回答

  • 基本的に基底クラスのコンストラクタ、継承クラスのコンストラクタという順に実行されるため、継承クラスのコンストラクタで値を設定したものが残るはずです。
    手元で、StatusStrip と ToolStripStatusLabel を配置、Modifiers を Protected に設定し、デザイナで ToolStripStatusLabel の Text プロパティに test と設定した上で継承フォームを作成し、その継承フォームのコンストラクタで 以下のようなコードを書きました。

    toolStripStatusLabel1.Text = "new";

    特に問題なくテキストは設定されて、表示されることを確認しています。

    ほかに、「基底テキスト」と設定しているタイミングがないか探してみる、あるいは「派生テキスト」の部分をきちんと通っていることをデバッグで確かめるなど、ほかの要因を探ってみてください。

    // 念のため:InitializeComponent の後に書いていますよね?

    • 回答の候補に設定 星 睦美 2014年2月3日 0:21
    • 回答としてマーク 星 睦美 2014年2月20日 5:07
    2014年1月31日 23:15
    モデレータ
  • Azuleanさんご回答ありがとうございました。

    ご指摘いただいた後、調べてみると、派生クラスのInitializeComponentメソッドの中に、toolStripStatusLabel1を初期化している部分を見つけました。故意に書いたわけではないのですが、なぜかそのコードが書かれていたので削除したところ正常に動作するようになりました。

    ありがとうございました。

    2014年2月4日 18:33

すべての返信

  • 基本的に基底クラスのコンストラクタ、継承クラスのコンストラクタという順に実行されるため、継承クラスのコンストラクタで値を設定したものが残るはずです。
    手元で、StatusStrip と ToolStripStatusLabel を配置、Modifiers を Protected に設定し、デザイナで ToolStripStatusLabel の Text プロパティに test と設定した上で継承フォームを作成し、その継承フォームのコンストラクタで 以下のようなコードを書きました。

    toolStripStatusLabel1.Text = "new";

    特に問題なくテキストは設定されて、表示されることを確認しています。

    ほかに、「基底テキスト」と設定しているタイミングがないか探してみる、あるいは「派生テキスト」の部分をきちんと通っていることをデバッグで確かめるなど、ほかの要因を探ってみてください。

    // 念のため:InitializeComponent の後に書いていますよね?

    • 回答の候補に設定 星 睦美 2014年2月3日 0:21
    • 回答としてマーク 星 睦美 2014年2月20日 5:07
    2014年1月31日 23:15
    モデレータ
  • Azuleanさんご回答ありがとうございました。

    ご指摘いただいた後、調べてみると、派生クラスのInitializeComponentメソッドの中に、toolStripStatusLabel1を初期化している部分を見つけました。故意に書いたわけではないのですが、なぜかそのコードが書かれていたので削除したところ正常に動作するようになりました。

    ありがとうございました。

    2014年2月4日 18:33
  • InitializeComponent の中身はデザイナが自動生成するもので、手作業で変更するものではありませんし、この件に限らず手作業で修正して対処することは考えないでください。
    理由はデザイナで何らかの操作をしたときに復活する可能性があるためです。

    前回、私から確認として書いたように InitializeComponent の後に書いたら済むということはないでしょうか?


    2014年2月4日 22:04
    モデレータ
  • 私も Azulean さんの意見に同意です。InitializeComponent メソッドの実装が定義されているDesigner.cs のコードを手動で編集しても、デザイナで変更した際、こちらの意図に反するプロパティ値が設定される可能性があります。

    Azulean さんが仰られてるとおり、InitializeComponent の後に書いたらいいのではないでしょうか?


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2014年2月6日 1:27
    モデレータ