投稿者 まる  (社会人) 投稿日時 2009/1/30 00:52:14
はじめまして。最近VB.NETでプログラマになったばかりのまると申します。

いきなりですが、会社からだされた練習問題でつまづいています・・・。
ご教授お願いいたします。

問題はこちらです。

テキストボックスが10個あります。(TextBox1~10)
テキストボックスに文字列をいれます。
①入力し終わって、他のコントロールに移るとエラーか判断します。
そのとき、もしそのテキストボックスの文字列のバイト数が11以上なら、エラーメッセージ表示。
また、なにも入っていなくてもエラーメッセージ表示。

ここからが自分がぶつかっているところなんです・・・。

今アクティブになっているテキストボックスより数字が高いTextBox(アクティブがTextBox5なら、TextBox6以上)にフォーカスが移るときは、エラー判断だけ。
②今アクティブになっているテキストボックスより数字が低いTextBox(アクティブがTextBox5なら、TextBox4以下)にフォーカスがいかないようにする。そのときも、アクティブなテキストボックスのエラー判断をする。
「前項目」ボタン(Button1)が押された時は、アクティブになっているテキストボックスの1つ前にフォーカスを移す(アクティブがTextBox5なら、TextBox4に)。そのときも、アクティブなテキストボックスのエラー判断をする。

今自分は、
TextBox1~10.Validatedメソッド で、①のエラー判断、
TextBox1~10.Validatingメソッド で、②になるような操作をしています。

今の状態だと、「前項目」ボタンや、フォームを閉じるためのボタン(Button2)もききません。ブレークポイントで試してみても、ボタンが押されていない状態になっています。
ちなみにテキストボックスのタグにそれぞれのテキストボックスの数字が入っています。

説明が不足していたらすみません。よろしくお願いいたします。

Dim ActiveTag As Integer = 1 'アクティブなテキストボックスの取得に使っています。
Dim CmpTag As Integer = 1 'テキストボックスの比較に使っています。

    Private Sub TextMove(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
                TextBox1.Validated, TextBox2.Validated, TextBox3.Validated, TextBox4.Validated, _
                TextBox5.Validated, TextBox6.Validated, TextBox7.Validated, TextBox8.Validated, _
                TextBox9.Validated, TextBox10.Validated

        Dim SJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        Dim textname As String

        If ActiveControl.CausesValidation = False Then
            Exit Sub
        End If


        textname = "TextBox" + CStr(ActiveTag)

    'テキストボックスの中身がバイト数11以上だったら
        If SJIS.GetByteCount(Me.Controls(textname).Text) > 10 Then

            MsgBox(CStr(ActiveTag) + "番目の文字が長すぎます。", MsgBoxStyle.Critical, "確認")

            Me.Controls(textname).Focus()

    'テキストボックスの中身が何もなければ
        ElseIf SJIS.GetByteCount(Me.Controls(textname).Text) = 0 Then

            MsgBox(CStr(ActiveTag) + "番目に文字が入力されていません。", MsgBoxStyle.Critical, "確認")

            Me.Controls(textname).Focus()

        End If

        ActiveTag = CInt(ActiveControl.Tag)

    End Sub

    Private Sub TextValidating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles _
    TextBox1.Validating, TextBox2.Validating, TextBox3.Validating, TextBox4.Validating, TextBox5.Validating, _
    TextBox6.Validating, TextBox7.Validating, TextBox8.Validating, TextBox9.Validating, TextBox10.Validating

        If ActiveControl.CausesValidation = False Then
            Exit Sub
        End If

        CmpTag = CInt(ActiveControl.Tag)

    '直前にアクティブだったテキストボックスと、次に選択されたテキストボックスの比較
        If ActiveTag > CmpTag Then

            e.Cancel = True

        End If

    End Sub