C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ユーザーコントロール内で自身の初期値設定をしたいときの書き方


(過去ログ 87 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■52078 / inTopicNo.1)  ユーザーコントロール内で自身の初期値設定をしたいときの書き方
  
□投稿者/ KOBA5963 (1回)-(2010/07/30(Fri) 12:20:59)

分類:[VB.NET/VB2005 以降] 

 初めまして、VB.NET を勉強中でユーザーコントロールを作ろうとしています。
 テキストボックスを内包するユーザーコントロールで、そのユーザーコントロールの中でテキストボックスの初期値を今日の日付にしようと思い、ユーザーコントロールの Load イベントの中で、内包するテキストボックス.Text = Date.Today.ToShortDateString() と書きました。
 また、ユーザーコントロールに TextChanged イベントを定義(Public Event 〜)して、テキストボックスの TextChanged イベントを捕らえて発生(RaiseEvent 〜)するように仕込みました。

 このユーザーコントロールを他のコントロールと共にフォームに貼りました。
 フォームの中ではユーザーコントロールの TextChanged イベントを捕らえて、他のコントロールと連携した独自の処理が走るようになってます。

 こんな感じなのですがフォームに貼ったユーザーコントロールの TextChanged イベントが想定よりも意図しないタイミングで発生してしまいました。
 デバッガで追っかけると、フォームデザイナ内の InitializeComponent の中で他のコントロールの初期化が済むより前、ユーザーコントロールの初期化を行っているときにユーザーコントロールの Load イベントに書かれた今日の日付を初期値セットする、というロジックでユーザーコントロールに内包されたテキストボックスの TextChanged に引っかかり、RaiseEvent TextChanged〜 されて、結果としてフォームに貼ったユーザーコントロールの TextChanged イベントが発生、という風になっているようです。

 確かに正しい動作だとは思いますが、気持ち的にはフォームの InitializeComponent が全て終わってから(他のコントロールの初期化も一通り済んでから)TextChanged イベントが起きてくれたら助かるのですが。。。
 フォームの InitializeComponent の後半に EndInit とか ResumeLayout とか書かれてますが、それまでに発生したイベントはキューに溜めるだけ溜めて、InitializeComponent が終わってから溜まってるイベントを次々と起こして欲しいというべきか。

 そもそも私の考え方自体が間違ってますでしょうか?

 今日の日付を初期値セットする前にユーザーコントロール内で Private なフラグを立てて、テキストボックスの TextChanged イベントのところでフラグが立ってたら RaiseEvent しないように〜とかするのが本来のスマートな書き方なのでしょうか?? 
引用返信 編集キー/
■52082 / inTopicNo.2)  Re[1]: ユーザーコントロール内で自身の初期値設定をしたいときの書き方
□投稿者/ よねKEN (561回)-(2010/07/30(Fri) 12:43:51)
よねKEN さんの Web サイト
No52078 (KOBA5963 さん) に返信
>  フォームの InitializeComponent の後半に EndInit とか ResumeLayout とか書かれてますが、それまでに発生したイベントはキューに溜めるだけ溜めて、InitializeComponent が終わってから溜まってるイベントを次々と起こして欲しいというべきか。

そういう挙動にしたい場合には、ISupportInitialize インターフェイスが使えるのではないでしょうか。

#といいつつ、ISupportInitialize インタフェースを実装するコントロールは作ったことがないので、
#未検証です。
引用返信 編集キー/
■52086 / inTopicNo.3)  Re[2]: ユーザーコントロール内で自身の初期値設定をしたいときの書き方
□投稿者/ 囚人 (525回)-(2010/07/30(Fri) 14:03:13)
>内包するテキストボックス.Text = Date.Today.ToShortDateString()

↑の初期化が終わってから、

>テキストボックスの TextChanged イベントを捕らえて発生(RaiseEvent 〜)するように仕込みました。

↑を行ったらいいんじゃないですかね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -