- PR -

コントロールの親フォームの取得方法

投稿者投稿内容
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-06-27 15:33
いつもお世話になっております。

Windows.Forms.TextBoxを継承して独自テキストボックスを作成しています。
インスタンス化された時点での親のフォームオブジェクトを取得したいのですが、方法がありますでしょうか?
(親フォームのプロパティを取得したいと考えています。)
Form.ActiveFormで取得するとNothingになっています。(あたりまえですが、)

Parentプロパティでどんどん上に登っていくしかないのでしょうか?

お知恵を拝借願います。

よろしくお願い致します。

Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-06-27 15:41
FindFormメソッドがありますが、自身のインスタンスが作られた時点では親も何もないような気が。

親コントロールにControls.AddされたときにParentChangedイベントが発生しますが、この辺で処理するのが自然かしら。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-06-27 15:43 ]
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-06-28 09:48
Hongliangさん、ご回答ありがとうございます。

ParentChangedイベント時にFindFormメソッドを呼び出してもNothingのままでした。
デザイン画面でフォームに貼り付けた時にはどれが親フォームか分かっていそうですがね。

内容を簡単に言うと、テキストボックスを継承したユーザコントロールを作成し、必須プロパティを用意しました。
そして、フォームを継承したユーザコントロールには必須項目の背景色を設定できるようにしました。そうする事でこのフォーム上の必須コントロールの背景を統一しようとしています。

実行時に親フォームが見つけられず、背景色が設定できません。
何か分かる方法があったら、お教え下さい。

よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-28 10:19
引用:

ParentChangedイベント時にFindFormメソッドを呼び出してもNothingのままでした。
デザイン画面でフォームに貼り付けた時にはどれが親フォームか分かっていそうですがね。


いや、ですから先のレスにあるように、
Formのインスタンス.Controls.Add しないとダメですよね?



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-06-28 11:30
じゃんぬねっとさん、申し訳ありません。
もう一度質問になってしまいますが、
デザイン画面でフォームにコントロールを追加すると、自動的にInitializeComponentメソッドでControls.Addされています。
この事を言っているのですか?
この順番をControls.Addしてからデフォルトプロパティを設定する様にすれば良いという事ですか?(InitializeComponentメソッド内の順番)

申し訳ありませんが、もう少し詳しく教えて下さい。

よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-28 12:12
引用:

この順番をControls.Addしてからデフォルトプロパティを設定する様にすれば良いという事ですか?(InitializeComponentメソッド内の順番)


順番ってなんだろう... 別に順番は関係ないような。
それと、InitializeComponent 内は触らないでくださいね。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2005-06-28 12:57
申し訳ありません。
原因は違う所にありました。

ParentChangedイベント時のFindForm.GetType.ToStringメソッドを呼び出した時、
取得したタイプが「プロジェクト名.Form1」になっていました。
コントロールでGetTypeした時は継承コントロールの名前になるのに、継承フォームの場合、継承フォーム名になっていませんでした。

例えば、Formを継承したMyFormというクラスを作成し、Necessaryプロパティを追加した場合、GetTypeがMyFormかどうか判断してNecessaryプロパティにアクセスしないと落ちる可能性があります。
私の場合、MyForm型の変数を用意しておいて、GetTypeでMyFormならこの変数に入れて独自プロパティにアクセスしようとしているのですが、みなさんはどの様にアクセスしますか?
MyFormかどうか判断する方法がありましたら、お教え下さい。

よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-06-28 13:33
型の判断はTypeOf...Isで行うようにしましょう。
C#でしたらasキャストが使えるのでもうちょっと便利ですが。
//VB2005でC#のasキャストに相当するTryCastが可能になりますが。

オブジェクト指向的に疑問のある設計のような気がしますが、そちらは割と面倒な話になりそうですので置いておくとして。

私自身が提案したParentChangedですが、これは不完全ですね。
例えばGroupBoxにAddされるとそこで発生してしまい、そのGroupBoxがFormにAddされたときには発生しなくなります。
senderのParentがFormがどうか確認して、
そうでないならsenderのParentChangedからRemoveHandlerし、改めてsenderのParentにAddHandlerするとかする必要がある……かな。

スキルアップ/キャリアアップ(JOB@IT)