投稿者 hori  (社会人) 投稿日時 2021/11/1 17:40:26
Form に TextBox 2つと Button を1つ配置して付きのようなコードを書きました。

=================================================================

Public Class Form1

    Dim flg As Integer = 0

    Private Sub TextBox1_Enter(sender As Object, e As EventArgs) Handles TextBox1.Enter

        flg = 1

        TextBox1.Text = "3"

    End Sub

    Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown

        If e.KeyData = Keys.Enter Then

            TextBox2.Text = "4"

            TextBox2.Select()

        End If

    End Sub

    Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave

        If flg = 1 Then

            MsgBox("tbx")

            flg = 2

        End If

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        flg = 5

        MsgBox("btn")

    End Sub

    Private Sub TextBox2_Enter(sender As Object, e As EventArgs) Handles TextBox2.Enter

        TextBox2.Text = CStr(flg)

    End Sub

    Private Sub TextBox2_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox2.KeyDown

        If e.KeyData = Keys.Enter Then

            flg = Val(TextBox2.Text)

        End If

    End Sub

End Class

===================================================================

いろいろやってみて判ったことは、
①TextBox1 にフォーカスがある時、Button1 をクリックしたら TextBox1.Leave が発生し、Button1.Click は無視される。(MsgBox("btn") が表示されない。)
②TextBox1 にフォーカスがある時、TextBox2 をクリックしたら TextBox1.Leave が発生し、その後、TextBox2.Enter が発生する。("tbx" が表示され、flg = 2 になる)

と云う事です。①の場合、僕の感覚ではボタンをクリックしたから Leave が発生するのだから、ボタン・クリックが先でテキスト1・リープが後であるべきだと思うのですが・・・・

ともかく、①の状況でボタン・クリックをしたとき、"tbx" を表示させずに、"btn" を表示させる。けれど、②の状況では現状維持と云う方法はありますか?。

そのためには、Leave の発生原因を取得できれば一番いいのですが、僕の調べた限り無いようなのです。が、本当はあるんじゃないかと思って質問しました。

次善策としては、上記の例なら、TextBox2.Enter 内に、MsgBox("tbx") を移動させて、TextBox1.Leave を削除する事かなと思うのですが、これを実行する前に本当に無いのかどうか確かめたいのです。

ご存知の方、居られましたらよろしくご教示ください。