Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
ValidatingとLeaveについて。
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=270#CommentId1846
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
まる
 (社会人)
投稿日時
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