投稿者 TOMTOM  (社会人) 投稿日時 2009/4/21 05:35:33
はじめまして。
今までずっとCOBOLを使っていたのですが、VBを独学で覚えなければならなくなり
VBは全く触ったことが無かった為、途方にくれていたところ
こちらのサイトにたどり着きまして、こちらの講座には大変お世話になっております。
いくつか入門用のサイトを巡ってきましたが、私のような者にはこちらの講座は
非常に分かりやすくて助かっています。

今回投稿させていただいたのは、VaridatingとVaridatedについて不可解な現象に遭遇した為
なぜこういう動きになるのか、どこが悪いのかご指摘いただければと思った次第です。

やりたい事は、まずPanel1が有りまして、その中にtxtHatsu1~9、txtSyuksu1~9、txtGtanka1~9、
txtGkin1~9のテキストボックスが有ります。
あらかじめデータを読み込んで、数値をテキストボックスに表示しておきます。
そこでtxtSyuksu?の中の数値を変更してフォーカスを次に移動する時に
txtHatsu?の中の数値と比較して、txtHatsu?よりtxtSyuksu?の方が小さければ
txtSyuksu?とtxtGtanka?を掛算した結果をtxtGkin?へ表示。
逆にtxtHatsu?よりtxtSyuksu?の方が大きければ確認のmsgboxを出して、
”はい”を選択すると同様に計算し、”いいえ”を選択すると計算せずにフォーカス移動もキャンセルという動きにしたいのです。

そこで以下のようなコードを書いたのですが、起きている現象は
txtHatsu?よりtxtSyuksu?の方が大きければ確認のmsgboxが出るところまでは良いのですが、
”はい”を選択してもフォーカスは移動するのですが計算がされません。
msgboxが出るのでVaridatingイベントは起きているでしょうし、
txtHatsu?よりtxtSyuksu?の方が小さければ計算されるのでVaridatedイベントも起きていると思うのですが
何故こうなってしまうのでしょう?
Varidatedイベント発生時の内容をVaridatingイベント発生時の処理の後ろに挿入してやると
とりあえずやりたい内容は出来るのですが、私の書き方が根本的に間違っているのか、
或いはもしかしてVaridatingとVaridatedを両方書くというのは本来やるべきでない方法なのでしょうか?

ちなみにMicrosoft Visual Basic 2008 Express Editionを使っています。

    Private Sub txtSyuksu_Validated(ByVal sender As ObjectByVal e As System.EventArgs) Handles txtSyuksu1.Validated, txtSyuksu2.Validated, txtSyuksu3.Validated, txtSyuksu4.Validated, txtSyuksu5.Validated, txtSyuksu6.Validated, txtSyuksu7.Validated, txtSyuksu8.Validated, txtSyuksu9.Validated
        Dim kingaku As Decimal
        Dim i As Integer

        i = Syuksu_Focus() '現在フォーカスのあるtxtSyuksu?の位置を取得 

        If Panel1.Controls("txtSyuksu" & i).Text = "" Or Panel1.Controls("txtGtanka" & i).Text = "" Then
            Exit Sub
        End If

        kingaku = CDec(Panel1.Controls("txtSyuksu" & i).Text) * CDec(Panel1.Controls("txtGtanka" & i).Text)
        Panel1.Controls("txtGkin" & i).Text = kingaku

    End Sub

    Private Sub txtSyuksu_Validating(ByVal sender As ObjectByVal e As System.ComponentModel.CancelEventArgs) Handles txtSyuksu1.Validating, txtSyuksu2.Validating, txtSyuksu3.Validating, txtSyuksu4.Validating, txtSyuksu5.Validating, txtSyuksu6.Validating, txtSyuksu7.Validating, txtSyuksu8.Validating, txtSyuksu9.Validating
        Dim i As Integer
        Dim wkHatsu As Decimal
        Dim wkSyuksu As Decimal
        Dim RET As Integer

        i = Syuksu_Focus() '現在フォーカスのあるtxtSyuksu?の位置を取得 

        If Panel1.Controls("txtHatsu" & i).Text = "" Or Panel1.Controls("txtSyuksu" & i).Text = "" Then
            Exit Sub
        End If

        wkHatsu = CDec(Panel1.Controls("txtHatsu" & i).Text)
        wkSyuksu = CDec(Panel1.Controls("txtsyuksu" & i).Text)
        If wkHatsu < wkSyuksu Then
            RET = MsgBox("発注数より多いのですか?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "確認")
            If RET = vbNo Then
                e.Cancel = True
            End If
        End If

    End Sub

    Private Function Syuksu_Focus() As Integer
        Dim i As Integer = 1

        Select Case True
            Case txtSyuksu1.Focused = True
                i = 1
            Case txtSyuksu2.Focused = True
                i = 2
            Case txtSyuksu3.Focused = True
                i = 3
            Case txtSyuksu4.Focused = True
                i = 4
            Case txtSyuksu5.Focused = True
                i = 5
            Case txtSyuksu6.Focused = True
                i = 6
            Case txtSyuksu7.Focused = True
                i = 7
            Case txtSyuksu8.Focused = True
                i = 8
            Case txtSyuksu9.Focused = True
                i = 9
        End Select

        Return i

    End Function