2

Windows アプリケーションを開発しています。フォームがあり、そのフォームのテキスト ボックスを検証しようとしています。

テキストボックスがAlphabates、Didgits、およびコンマのみを受け入れるように、テキストボックスにいくつかの検証を行いたいと思います(特殊記号のような他の文字は許可されません)。

コードを書き込もうとしていますが、うまくいかないことがあります。ただし、<>/; などの特殊文字は引き続き使用できます。どのような変更を行う必要がありますか?

ここにコードがあります...

キーダウン イベント

 Private Sub txtOLDBuildingName_KeyDown(sender As Object, e As KeyEventArgs) Handles txtOLDBuildingName.KeyDown

        ' Initialize the flag to false.
        nonNumberEntered = False

        ' Determine whether the keystroke is a number from the top of the keyboard. 
        If (e.KeyCode < Keys.D0 And e.KeyCode > Keys.D9) And (e.KeyCode > Keys.A And e.KeyCode < Keys.Z) Then
            nonNumberEntered = True
        End If
        'If shift key was pressed, it's not a number. 
        If Control.ModifierKeys = Keys.Shift Then
            nonNumberEntered = True
        End If


    End Sub

キー押下イベント

  Private Sub txtOLDBuildingName_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtOLDBuildingName.KeyPress
           If nonNumberEntered = True Then
               e.Handled = True
        End If

   End Sub
4

1 に答える 1

7

イベントを処理しているサブを削除し、KeyDownイベントを処理しているサブをこれに置き換えKeyPressます。

ReadOnly ValidChars As String = _
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,"

Private Sub txtOLDBuildingName_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) _
Handles txtOLDBuildingName.KeyPress

    e.Handled = Not (ValidChars.IndexOf(e.KeyChar) > -1 _
                OrElse e.KeyChar = Convert.ToChar(Keys.Back))

End Sub

アップデート:

この変更はより正確で、貼り付ける前にクリップボードの内容を比較します。

ReadOnly AllowedKeys As String = _
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,"

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress

    Select Case e.KeyChar

        Case Convert.ToChar(Keys.Enter) ' Enter is pressed
            ' Call method here...

        Case Convert.ToChar(Keys.Back) ' Backspace is pressed
            e.Handled = False ' Delete the character

        Case Convert.ToChar(Keys.Capital Or Keys.RButton) ' CTRL+V is pressed
            ' Paste clipboard content only if contains allowed keys
            e.Handled = Not Clipboard.GetText().All(Function(c) AllowedKeys.Contains(c))

        Case Else ' Other key is pressed
            e.Handled = Not AllowedKeys.Contains(e.KeyChar)

    End Select

End Sub
于 2013-10-21T04:39:43.707 に答える