トップ回答者
基底Form上にあるコントロールの値を、派生Formのコンストラクタで設定したい。

質問
-
Windows Formの画面を複数作る必要があり、共通する部分は基底Formとして配置し、それを継承して派生Formのデザインを行っています。
共通する部分は、例えば、ステータスバーとして、「StatusStrip」と「ToolStripStatusLabel」を配置しています。
ここで例えば、基底Form上のToolStripStatusLabelのTextに「基底テキスト」としていると、
派生Formのコンストラクタで基底Form上のToolStripStatusLabelのTextに「派生テキスト」とセットしても反映されず「基底テキスト」のままになっています。
おそらく、処理の順番が派生Formのコンストラクタが実行されたあとに基底のFormのコントロールに設置した値で上書きしているせいで、反映されないようになっているのではないかと考えました。
Form_Loadイベントで設定してしまえば解決するとは思うのですが、現在実装しているコードが少し煩雑になるので、できればコンストラクタ内で実装したいと考えてます。
何か対処策があれば教えて下さい。
回答
-
基本的に基底クラスのコンストラクタ、継承クラスのコンストラクタという順に実行されるため、継承クラスのコンストラクタで値を設定したものが残るはずです。
手元で、StatusStrip と ToolStripStatusLabel を配置、Modifiers を Protected に設定し、デザイナで ToolStripStatusLabel の Text プロパティに test と設定した上で継承フォームを作成し、その継承フォームのコンストラクタで 以下のようなコードを書きました。toolStripStatusLabel1.Text = "new";
特に問題なくテキストは設定されて、表示されることを確認しています。
ほかに、「基底テキスト」と設定しているタイミングがないか探してみる、あるいは「派生テキスト」の部分をきちんと通っていることをデバッグで確かめるなど、ほかの要因を探ってみてください。
// 念のため:InitializeComponent の後に書いていますよね?
すべての返信
-
基本的に基底クラスのコンストラクタ、継承クラスのコンストラクタという順に実行されるため、継承クラスのコンストラクタで値を設定したものが残るはずです。
手元で、StatusStrip と ToolStripStatusLabel を配置、Modifiers を Protected に設定し、デザイナで ToolStripStatusLabel の Text プロパティに test と設定した上で継承フォームを作成し、その継承フォームのコンストラクタで 以下のようなコードを書きました。toolStripStatusLabel1.Text = "new";
特に問題なくテキストは設定されて、表示されることを確認しています。
ほかに、「基底テキスト」と設定しているタイミングがないか探してみる、あるいは「派生テキスト」の部分をきちんと通っていることをデバッグで確かめるなど、ほかの要因を探ってみてください。
// 念のため:InitializeComponent の後に書いていますよね?
-
InitializeComponent の中身はデザイナが自動生成するもので、手作業で変更するものではありませんし、この件に限らず手作業で修正して対処することは考えないでください。
理由はデザイナで何らかの操作をしたときに復活する可能性があるためです。前回、私から確認として書いたように InitializeComponent の後に書いたら済むということはないでしょうか?
- 編集済み AzuleanMVP, Moderator 2014年2月4日 22:04