|
分類:[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 しないように〜とかするのが本来のスマートな書き方なのでしょうか??
|