Windows Form のテキストボックスのフォーカス系イベントで毎々どれを使うか悩むので、フォーカス系イベントの発生順を調査しました。
作業環境
OS | Windows 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:タブキーでフォーカスアウト
- Leave
- Validating
- Validated
- LostFocus
検証2:タブキーでフォーカスイン
- Enter
- GotFocus
検証3:マウスでフォーカスアウト
- LostFocus
- Leave
- Validating
- Validated
検証4:マウスでフォーカスイン
- Enter
- GotFocus
検証5:ウィンドウのアクティブ時
- GotFocus
検証6:ウィンドウの非アクティブ時
- LostFocus
結論
MSDNの記載通り、「タブキーでのフォーカスアウト」と「マウスでのフォーカスアウト」でLostFocus
イベントの発生順が異なります。
また、「ウィンドウのアクティブ時」と「ウィンドウの非アクティブ時」で GotFocus
、LostFocus
イベントが発生しています。
⇒ MSDNの記載通り、Enter
、Leave
イベントを利用するのが良い!