VB6ではコントロールがフォーカスを受け取った時にGotFocusイベントが、フォーカスを失った時にLostFocusイベントが発生しましたが、.NETではこれらのイベントが見つかりません。.NETではどのようにすればよいのでしょうか?
MSDNの「Visual Basic .NET における TextBox コントロールの変更点」によると、VB6のGotFocus及びLostFocusイベントに代わるものは、.NETではEnter及びLeaveイベントだということです。よって、これらのイベントを使用すればよいでしょう。
ここからは余談です。実は、VB.NETにもGotFocusとLostFocusイベントは存在しています。しかしVisual Studioでは、VB.NETの場合はコードエディタ上の「メソッド名ボックス」に、C#の場合はプロパティウィンドウの「イベント」に、GotFocusとLostFocusが表示されません。
GotFocusイベントとLostFocusイベントについて、MSDNの「GotFocus イベント」と「LostFocus イベント」には次のように書いてあります。
「GotFocus イベントおよび LostFocus イベントは、WM_KILLFOCUS Windows メッセージおよび WM_SETFOCUS Windows メッセージに結び付けられた、低水準のフォーカス イベントです。一般的に、 GotFocus イベントおよび LostFocus イベントは、 UICues を更新するときにだけ使用されます。 Activated イベントおよび Deactivate イベントを使用する Form クラス以外のすべてのコントロールに対して、 Enter イベントおよび Leave イベントを使用する必要があります。」
つまり、GotFocus及びLostFocusイベントの代わりに、Enter及びLeaveイベントを使うべきという意味でこれらが表示されないようです。
以下にLostFocusイベントを使ったコードを一応書いておきます。
Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'TextBox1のLostFocusイベントハンドラを追加する AddHandler TextBox1.LostFocus, AddressOf TextBox1_LostFocus End Sub 'LostFocusイベントハンドラ Private Sub TextBox1_LostFocus(ByVal sender As Object, _ ByVal e As EventArgs) Console.WriteLine("LostFocusイベントが発生しました。") End Sub
private void Form1_Load(object sender, System.EventArgs e) { //TextBox1のLostFocusイベントハンドラを追加する TextBox1.LostFocus += new EventHandler(TextBox1_LostFocus); } //LostFocusイベントハンドラ private void TextBox1_LostFocus(object sender, EventArgs e) { Console.WriteLine("LostFocusイベントが発生しました。"); }
(この記事はメールマガジン「.NETプログラミング研究」で紹介したものを書き直したものです。)