トップ回答者
VB、データ型の不一致対策: 入力されたデータの型が違う時はそこから出られないようにして、一致したときに他へ移動できるようにしたい。

質問
-
現在、VBでフォーム作成中です。 VB2010 Express, サーバーは、SQL2003(SQL認証接続)です。
数値専用のコントロール(主として、テキストボックス)に文字型等のデータを入力(型違い入力)したときの、警告表示まではできています。 NULLやスペース入力対策も済んでいます。
しかし、数値型テキストボックスへの不正データ型(文字型、日付等)の入力の場合、警告だけでは不十分で、正しい型のデータ入力があるまで、そこで待機させたいのです。
つまり、この場合、マウス等で他のテクストボックス等への移動を禁止にし、正しい型(数値)の入力があって初めて他へ移動できるようにしたいです。
いろいろ調べて実験したのですが、うまくいきません。
ご教示を、お願いします。
yksaila
- 編集済み yksaila 2012年4月21日 6:47
回答
-
ValidatingイベントとValidatedイベントで実装できると思います。
Control.Validating イベント (System.Windows.Forms)
Control.Validated イベント (System.Windows.Forms)
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
- 編集済み jhashimoto 2012年4月19日 13:12
- 回答としてマーク yksaila 2012年4月21日 8:15
-
J.Hashimotoさんへ
ご教示ありがとうございました。
Validating,Validatedは調べたのですが、私の調べたコードが不十分だったようで、なかなかできなかったのです。 ご教示のMSDNライブラリーの見本を参考にしたらできました。
下記に、コードを記しておきます。 この場合、Validatedはなくても構わないのですよね。
これで標題の条件はみたせました、本当に助かりました。
Private Sub CB_CustomerType_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles CB_CustomerType.Validating
If Not IsNumeric(Me.CB_CustomerType.Text) Then
e.Cancel = True
Me.CB_CustomerType.Select()End If
End Subyksaila
すべての返信
-
ValidatingイベントとValidatedイベントで実装できると思います。
Control.Validating イベント (System.Windows.Forms)
Control.Validated イベント (System.Windows.Forms)
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
- 編集済み jhashimoto 2012年4月19日 13:12
- 回答としてマーク yksaila 2012年4月21日 8:15
-
こんにちは。
題名を読むとデータ型の一致・不一致の見極めの仕方の質問のような感じです。一方、本文を読むと、データの型が一致するまでコントロールの移動を禁止する方法の質問に読み取れます。質問は後者だと思いますが、ただどの部分が難しいのですか?読んでもそれがわかりません。実際のコードの一部もないことだし、何を提案したら良いか他の人もわからないでしょうね。
やり方は人によって万遍だと思いますが、簡単に考えると例えば次のやり方とか。。。
Private txt As Integer TextBox1のTextChanged: 入力の型が一致の場合のtxtを1に TextBox2のTextChanged: 入力の型が一致の場合のtxtを2に TextBox3のTextChanged: 入力の型が一致の場合のtxtを3に ... 'Timer1 Select Case txt Case 1 TextBox1.Enabled = True TextBox2.Enabled = False TextBox3.Enabled = False TextBox1.Focus Case 2 TextBox1.Enabled = False TextBox2.Enabled = True TextBox3.Enabled = False TextBox2.Focus Case 3 TextBox1.Enabled = False TextBox2.Enabled = False TextBox3.Enabled = True TextBox3.Focus ... End Select
Onion is a recent refuge from Mac OS X and hates Mac App Store. System: Windows 7 x64
-
J.Hashimotoさんへ
ご教示ありがとうございました。
Validating,Validatedは調べたのですが、私の調べたコードが不十分だったようで、なかなかできなかったのです。 ご教示のMSDNライブラリーの見本を参考にしたらできました。
下記に、コードを記しておきます。 この場合、Validatedはなくても構わないのですよね。
これで標題の条件はみたせました、本当に助かりました。
Private Sub CB_CustomerType_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles CB_CustomerType.Validating
If Not IsNumeric(Me.CB_CustomerType.Text) Then
e.Cancel = True
Me.CB_CustomerType.Select()End If
End Subyksaila
-
Me.CB_CustomerType.Select() は要らないはずです。確認して下さい。検証関連というか、フォーカス移動に関する一連のイベント ハンドラで、フォーカスの移動を行うと混乱する場合があったように記憶しています(何処かのコミュニティで、メッセージボックスを表示すると、意図した通りにならないという質問があったはず)。ErrorProvider を使うことを検討してみて下さい。
以下、余分:コントロールの CausesValidation プロパティを false にすると、そのコントロールにフォーカスが移動する時に検証イベントが動作しなくなります。キャンセル動作を行うコントロールで、この様に設定します。
なお、Form にも CausesValidation プロパティがありますが、false にしても、誤りがある場合に[×]ボタンでフォームを閉じることができません。この場合、Form.Closing イベント内で e.Cancel を false にします。
Jitta@わんくま同盟