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
.