特にVB6しか使ってこなかった人によくあるやつの説明用。
MSDN
Control.GotFocus
Control.LostFocus
どちらにも発生順がちゃんと記されてあって、タブ遷移とマウス遷移によって、LostFocusの発生順が違うことが分かる。
Note部をGoogle先生に頑張って翻訳してもらうと
GotFocusおよびLostFocusイベントは、WM_KILLFOCUSおよびWM_SETFOCUS Windowsメッセージに関連付けられている低レベルのフォーカスイベントです。 通常、GotFocusイベントとLostFocusイベントは、UICueを更新するとき、またはカスタムコントロールを作成するときにのみ使用されます。 代わりに、ActivateイベントとDeactivateイベントを使用するFormクラス以外のすべてのコントロールに対して、EnterイベントとLeaveイベントを使用する必要があります。 GotFocusおよびLostFocusイベントの詳細については、WM_SETFOCUSおよびWM_KILLFOCUSトピックを参照してください。
つまり、コントロールを作成する時以外に、GotFocus, LostFocusなんてつかわん、ということ。
試す
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.GotFocus += TextBox1_GotFocus;
textBox1.LostFocus += TextBox1_LostFocus;
}
private void TextBox1_LostFocus(object sender, EventArgs e)
{
Console.WriteLine("LostFocus");
}
private void TextBox1_GotFocus(object sender, EventArgs e)
{
Console.WriteLine("GotFocus");
}
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");
}
}
発生順は以下の通り。
- タブによるフォーカスイン
- Enter
- GotFocus
- タブによるフォーカスアウト
- Leave
- Validating
- Validated
- LostFocus
- マウスによるフォーカスイン
- Enter
- GotFocus
- マウスによるフォーカスアウト
- LostFocus
- Leave
- Validating
- Validated
- ウィンドウのアクティブ化
- GotFocus
- ウィンドウの非アクティブ化
- LostFocus
MSDNに記されている通り、タブとマウスによるフォーカスアウトでは、LostFocusの発生順が一定ではない。
更にGotFocus, LostFocusは、ウィンドウのアクティブ状態によっても発生する。
つまり、GotFocus, LostFocusを利用しなければならない明確な理由がない以上は、何も考えなくていいからEnter, Leave使おう