Help us understand the problem. What is going on with this article?

フォーカス系イベントの発生順を知る

More than 1 year has passed since last update.

特に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なんてつかわん、ということ。

試す

Form1.cs
    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");
        }
    }

発生順は以下の通り。

  • タブによるフォーカスイン
    1. Enter
    2. GotFocus
  • タブによるフォーカスアウト
    1. Leave
    2. Validating
    3. Validated
    4. LostFocus
  • マウスによるフォーカスイン
    1. Enter
    2. GotFocus
  • マウスによるフォーカスアウト
    1. LostFocus
    2. Leave
    3. Validating
    4. Validated
  • ウィンドウのアクティブ化
    1. GotFocus
  • ウィンドウの非アクティブ化
    1. LostFocus

MSDNに記されている通り、タブとマウスによるフォーカスアウトでは、LostFocusの発生順が一定ではない。
更にGotFocus, LostFocusは、ウィンドウのアクティブ状態によっても発生する。

つまり、GotFocus, LostFocusを利用しなければならない明確な理由がない以上は、何も考えなくていいからEnter, Leave使おう

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away