DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

GotFocusとLostFocusイベントはどこに行った?

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イベントを使ったコードを一応書いておきます。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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イベントが発生しました。");
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。