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

  • 質問

  • 現在、VBでフォーム作成中です。 VB2010 Express, サーバーは、SQL2003(SQL認証接続)です。

    数値専用のコントロール(主として、テキストボックス)に文字型等のデータを入力(型違い入力)したときの、警告表示まではできています。 NULLやスペース入力対策も済んでいます。

    しかし、数値型テキストボックスへの不正データ型(文字型、日付等)の入力の場合、警告だけでは不十分で、正しい型のデータ入力があるまで、そこで待機させたいのです。 

    つまり、この場合、マウス等で他のテクストボックス等への移動を禁止にし、正しい型(数値)の入力があって初めて他へ移動できるようにしたいです。

    いろいろ調べて実験したのですが、うまくいきません。 

    ご教示を、お願いします。

    yksaila


    • 編集済み yksaila 2012年4月21日 6:47
    2012年4月19日 10:21

回答

  • 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
    2012年4月19日 13:11
  • 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 Sub

    yksaila


    • 回答としてマーク yksaila 2012年4月21日 8:16
    • 編集済み yksaila 2012年4月21日 8:18
    2012年4月21日 8:15

すべての返信

  • 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
    2012年4月19日 13:11
  • こんにちは。

    題名を読むとデータ型の一致・不一致の見極めの仕方の質問のような感じです。一方、本文を読むと、データの型が一致するまでコントロールの移動を禁止する方法の質問に読み取れます。質問は後者だと思いますが、ただどの部分が難しいのですか?読んでもそれがわかりません。実際のコードの一部もないことだし、何を提案したら良いか他の人もわからないでしょうね。

    やり方は人によって万遍だと思いますが、簡単に考えると例えば次のやり方とか。。。

    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

    2012年4月20日 10:07
  • 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 Sub

    yksaila


    • 回答としてマーク yksaila 2012年4月21日 8:16
    • 編集済み yksaila 2012年4月21日 8:18
    2012年4月21日 8:15
  •  Me.CB_CustomerType.Select() は要らないはずです。確認して下さい。検証関連というか、フォーカス移動に関する一連のイベント ハンドラで、フォーカスの移動を行うと混乱する場合があったように記憶しています(何処かのコミュニティで、メッセージボックスを表示すると、意図した通りにならないという質問があったはず)。ErrorProvider を使うことを検討してみて下さい。

    以下、余分:コントロールの CausesValidation プロパティを false にすると、そのコントロールにフォーカスが移動する時に検証イベントが動作しなくなります。キャンセル動作を行うコントロールで、この様に設定します。

     なお、Form にも CausesValidation プロパティがありますが、false にしても、誤りがある場合に[×]ボタンでフォームを閉じることができません。この場合、Form.Closing イベント内で e.Cancel を false にします。


    Jitta@わんくま同盟

    2012年4月25日 12:21