C#における、テキストボックスからフォーカスを外した時のイベント(ロストフォーカス)の発生順番です。
テキストボックスからフォーカスを外した時のイベント発生順番
C#でテキストボックスからフォーカスが外れた場合、複数のイベントが走るのですが、それぞれ発生する順番が定められています。
MSDN上には2パターンの発生順番が記されています。
パターン1
キーボード (Tab、Shift + Tab など) を使用するか、Select メソッドまたは SelectNextControl メソッドを呼び出すか、ActiveControl プロパティを現在のフォームに設定してフォーカスを変更すると、次の順序で Control クラスのフォーカス イベントが発生します。
- Enter
- GotFocus
- Leave
- Validating
- Validated
- LostFocus
パターン2
マウスの使用、または Focus メソッドの呼び出しによってフォーカスを変更すると、次の順序で Control クラスのフォーカス イベントが発生します。
- Enter
- GotFocus
- LostFocus
- Leave
- Validating
- Validated
少し難しいかもしれませんので、フォーカスが外れた場合に絞って簡単に説明します。
キーボード操作でフォーカスが外れた場合、
- Leave
- Validating
- Validated
- LostFocus
の順にフォーカスが外れた際のイベントが発生します。
また、マウスを操作してフォーカスが外れた場合、
- LostFocus
- Leave
- Validating
- Validated
の順にフォーカスが外れた際のイベントが発生します。
キーボード操作とマウス操作で異なるのは、LostFocusイベントの発生順番です。
- キーボード操作でフォーカスが外れた場合→LostFocusイベントが最後に発生
- マウス操作でフォーカスが外れた場合は→LostFocusイベントが最初に発生
サンプルとして次の画面を用意しました。
オブジェクトはテキストボックスとボタンのみ。ボタンはテキストボックスからフォーカスを外すために用意しています。
サンプルコードはこちら。
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メソッドを呼び出して、ログファイルに書き込む仕様にしています。

画面上でテキストボックスにフォーカスをセットして、フォーカスを外すとログファイルに出力されます。
実際にログファイルに出力された内容を見てみます。
まずはキーボード操作でフォーカスが外れた場合のログです。
Leave → Validating → Validated → LostFocus の順でイベントが発生していることが分かります。
次に、マウス操作でフォーカスが外れた場合のログです。
LostFocus → Leave → Validating → Validated の順でイベントが発生していることが分かります。
参考サイト
イベントの順序 – Windows Forms .NET Framework | Microsoft Docs
.