0

我有一个 vb 形式的文本框,我想将用户可以放入文本框中的字符范围限制为:" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890^-*().". 文本框是将 SI 单位插入数据库,所以我需要一致的语法。如果用户在文本框中键入无效字符,我希望文本框拒绝插入或立即将其删除,将光标留在文本框中的相同位置。我还希望文本框替换"/""^(-"并将光标放在此之前。

我在其他地方找到了一些我已经编辑过的代码来执行此操作,但代码很糟糕,它会在文本框中更改的文本上激活。这会导致代码失败,当用户输入不允许的值时,代码会在尝试更改文本框中的文本时自行激活。

这是我的代码,文本框"enter SI Units"从表单设计器的内容开始。

Private Sub TxtQuantityTextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSIUnit.TextChanged

If txtSIUnit.Text = "Enter SI Units" Then
        Exit Sub
    End If

    Dim charactersAllowed As String = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890^-*()."
    Dim Text As String = txtSIUnit.Text
    Dim Letter As String
    Dim SelectionIndex As Integer = txtSIUnit.SelectionStart
    Dim Change As Integer




    Letter = txtSIUnit.Text.Substring(SelectionIndex - 1, 1)
    If Letter = "/" Then
        Text = Text.Replace(Letter, "^(-")
        SelectionIndex = SelectionIndex - 1
    End If



    Letter = txtSIUnit.Text.Substring(SelectionIndex - 1, 1)
    If charactersAllowed.Contains(Letter) = False Then
        Text = Text.Replace(Letter, String.Empty)
        Change = 1
    End If


    txtSIUnit.Text = Text
    txtSIUnit.Select(SelectionIndex - Change, 0)

    If txtQuantity.Text <> "Enter Quantity" Then
        If cmbStateRateSumRatio.SelectedIndex <> -1 Then
            bttAddQUAtoDatabase.Enabled = True
        End If
    End If

End Sub`

谢谢你的帮助。

4

2 回答 2

1

在文本框的KeyDown事件中,选中e.KeyCode. 这使您可以防止处理某些字符。KeyDown文档中有一个示例。

于 2012-09-07T12:50:49.627 回答
1

使用 KeyPress 事件。如果您不喜欢该角色,请将 e.Handled 设置为 true。这是一个单行:

Private Const AllowedChars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890^-*()."

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As PressEventArgs) Handles TextBox1.KeyPress
    If e.KeyChar >= " "c AndAlso Not AllowedChars.Contains(e.KeyChar) Then e.Handled = True
End Sub
于 2012-09-07T13:43:33.113 回答