テキストボックスのフォーカス系イベント発生順

Windows Form のテキストボックスのフォーカス系イベントで毎々どれを使うか悩むので、フォーカス系イベントの発生順を調査しました。

作業環境

OSWindows 11 Pro 22h2
開発ツールVisual Studio 2022 Version 17.5.5
言語C#
作業環境

MSDN

イベント GotFocus と LostFocus イベントは、WM_KILLFOCUSと windows メッセージに関連付けられた低レベルのフォーカス イベントWM_SETFOCUSです。 通常、イベント GotFocus と LostFocus イベントは、更新時またはカスタム コントロールの UICues 記述時にのみ使用されます。 代わりに、クラスとイベントをEnter使用するクラスを除くすべてのコントロールにForm対して、イベントとDeactivateイベントを使用するActivated必要Leaveがあります。 イベントのLostFocus詳細GotFocusについては、WM_KILLFOCUSとWM_KILLFOCUSのトピックを参照してください。

MSDN – Control.GotFocusインベント

MSDNのサイトによると、コントロールを作成するとき以外は GotFocusイベント、LostFocusイベントを使わないで、Enterイベント、Leaveイベントを使用することを推奨しています。

検証

下のような画面を用意します。
サンプル画面

続いて、下のようなコードを用意します。

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace FocusEventSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // GotFocusとLostFocusはイベントウィンドウから追加できないため
            // ここでイベントを追加します。
            textBox1.GotFocus += textBox1_GotFocus;
            textBox1.LostFocus += textBox1_LostFocus;
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            Console.WriteLine("Enter");
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            Console.WriteLine("Leave");
        }

        private void textBox1_Validated(object sender, EventArgs e)
        {
            Console.WriteLine("Validated");
        }

        private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            Console.WriteLine("Validating");
        }

        private void textBox1_GotFocus(object sender, EventArgs e)
        {
            Console.WriteLine("GotFocus");
        }

        private void textBox1_LostFocus(object sender, EventArgs e)
        {
            Console.WriteLine("LostFocus");
        }
    }
}

検証1:タブキーでフォーカスアウト

  1. Leave
  2. Validating
  3. Validated
  4. LostFocus
検証1結果
検証1:結果

検証2:タブキーでフォーカスイン

  1. Enter
  2. GotFocus
検証2:結果
検証2:結果

検証3:マウスでフォーカスアウト

  1. LostFocus
  2. Leave
  3. Validating
  4. Validated
検証3:結果
検証3:結果

検証4:マウスでフォーカスイン

  1. Enter
  2. GotFocus
検証4:結果
検証4:結果

検証5:ウィンドウのアクティブ時

  1. GotFocus
検証5:結果
検証5:結果

検証6:ウィンドウの非アクティブ時

  1. LostFocus
検証6:結果
検証6:結果

結論

MSDNの記載通り、「タブキーでのフォーカスアウト」と「マウスでのフォーカスアウト」でLostFocusイベントの発生順が異なります。
また、「ウィンドウのアクティブ時」と「ウィンドウの非アクティブ時」で GotFocusLostFocus イベントが発生しています。

⇒ MSDNの記載通り、EnterLeave イベントを利用するのが良い!