記事内に広告が含まれています。

【C#】超簡単!テキストボックスからフォーカスを外した時のイベント発生順番

C#における、テキストボックスからフォーカスを外した時のイベント(ロストフォーカス)の発生順番です。

【スポンサーリンク】

テキストボックスからフォーカスを外した時のイベント発生順番

C#でテキストボックスからフォーカスが外れた場合、複数のイベントが走るのですが、それぞれ発生する順番が定められています。

MSDN上には2パターンの発生順番が記されています。

パターン1

キーボード (Tab、Shift + Tab など) を使用するか、Select メソッドまたは SelectNextControl メソッドを呼び出すか、ActiveControl プロパティを現在のフォームに設定してフォーカスを変更すると、次の順序で Control クラスのフォーカス イベントが発生します。

  1. Enter
  2. GotFocus
  3. Leave
  4. Validating
  5. Validated
  6. LostFocus

パターン2

マウスの使用、または Focus メソッドの呼び出しによってフォーカスを変更すると、次の順序で Control クラスのフォーカス イベントが発生します。

  1. Enter
  2. GotFocus
  3. LostFocus
  4. Leave
  5. Validating
  6. Validated

少し難しいかもしれませんので、フォーカスが外れた場合に絞って簡単に説明します。

キーボード操作でフォーカスが外れた場合、

  1. Leave
  2. Validating
  3. Validated
  4. LostFocus

の順にフォーカスが外れた際のイベントが発生します。

また、マウスを操作してフォーカスが外れた場合、

  1. LostFocus
  2. Leave
  3. Validating
  4. Validated

の順にフォーカスが外れた際のイベントが発生します。

キーボード操作とマウス操作で異なるのは、LostFocusイベントの発生順番です。

  • キーボード操作でフォーカスが外れた場合→LostFocusイベントが最後に発生
  • マウス操作でフォーカスが外れた場合は→LostFocusイベントが最初に発生

サンプルとして次の画面を用意しました。

f:id:neko_britannia:20211112212838j:plain

オブジェクトはテキストボックスとボタンのみ。ボタンはテキストボックスからフォーカスを外すために用意しています。

サンプルコードはこちら。

public CS_Focus_Event()
{
    InitializeComponent();
    //LostFocusイベントのイベントハンドラ追加
    textBox1.LostFocus += new EventHandler(textBox1_LostFocus);
}

//LostFocusイベント
private void textBox1_LostFocus(object sender, EventArgs e)
{
    OutPutLog(MethodBase.GetCurrentMethod().Name + Environment.NewLine);
}

//Leaveイベント
private void textBox1_Leave(object sender, EventArgs e)
{
    OutPutLog(MethodBase.GetCurrentMethod().Name + Environment.NewLine);
}

//Validatingイベント
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    OutPutLog(MethodBase.GetCurrentMethod().Name + Environment.NewLine);
}

//Validatedイベント
private void textBox1_Validated(object sender, EventArgs e)
{
    OutPutLog(MethodBase.GetCurrentMethod().Name + Environment.NewLine);
}

private void OutPutLog(string strLog)
{
    //D:\CS\Log_OutPut\EventLog.log
    System.IO.StreamWriter objSW = new System.IO.StreamWriter(
        @"D:\CS\Log_OutPut\EventLog.log"
        , true
        , System.Text.Encoding.GetEncoding("shift_jis"));

    //書き込み
    DateTime objDT = DateTime.Now;
    objSW.Write(objDT.ToString("yyyy/MM/dd HH:mm:ss:fff") + " " + strLog);
    objSW.Close();

}

各イベント内でOutPutLogメソッドを呼び出して、ログファイルに書き込む仕様にしています。

f:id:neko_britannia:20211112212928j:plain
テキストボックスのフォーカスを外しただけの画面

画面上でテキストボックスにフォーカスをセットして、フォーカスを外すとログファイルに出力されます。

実際にログファイルに出力された内容を見てみます。

まずはキーボード操作でフォーカスが外れた場合のログです。

f:id:neko_britannia:20211112213151j:plain

Leave → Validating → Validated → LostFocus の順でイベントが発生していることが分かります。

次に、マウス操作でフォーカスが外れた場合のログです。

f:id:neko_britannia:20211112213528j:plain

LostFocus → Leave → Validating → Validated の順でイベントが発生していることが分かります。

【スポンサーリンク】

参考サイト

イベントの順序 – Windows Forms .NET Framework | Microsoft Docs

.