文本框验证

时间:2010-11-12 15:05:50

标签: vb.net visual-studio-2010

我在表单中使用了很多文本框。 我如何验证它们, 在某些文本框中,我只需要使用文本,而在某些文本框中我只能使用数字。 使用ASCII是一种正确的方法还是有更简单的方法来做到这一点。如果是这样,请让我知道编码。

8 个答案:

答案 0 :(得分:7)

最重要的是,不要惹恼用户。如果我正在键入一些文本并且应用程序阻止了(不管它是怎么做的),我理所当然地生气。

有多个值可以解决这个问题:

  • 使用NumericUpDownSlider控件而不是文本框作为数值(换句话说:使用正确的控件而不是通用控件)。

  • 允许(或多或少)任意输入并尝试以有意义的方式解析用户输入。例如,输入“+33 (0) 6 12-34-56”对于法国的电话号码来说是完全有意义的格式。应用程序应该允许,并尝试正确解析它。

    当然,这是最难的方式,但它提供了最佳的用户体验。

  • 使用Validating事件验证输入。只要用户离开输入控件,即当他们完成他们的输入时,就会自动触发,并且验证不会惹恼用户。

    该事件的MSDN文档提供了如何正确使用此事件的示例。

使用KeyPressTextChanged事件进行验证。第一个会在输入文本时打扰用户。当他们尝试从其他地方粘贴文本时,第二个也会惹恼他们。想象一下:我正在尝试从网站上复制一个数字。不幸的是,我复制的文字也包含其他内容,例如: “eggs: 14.33 EUR”而不只是“14.33”。

现在,应用程序必须让我有机会粘贴并更正文本。如果我不被允许这样做,那么应用程序就是UX失败。如果应用程序使用TextChanged事件来阻止我粘贴此文本,我将无法删除有问题的文本。

答案 1 :(得分:1)

文字仅限40个字符:

<asp:RegularExpressionValidator ID="regexpText" runat="server"     
                                ErrorMessage="Text only!" 
                                ControlToValidate="txtName"     
                                ValidationExpression="^[a-zA-Z]{1,40}$" />

只有数字:

<asp:RegularExpressionValidator ID="regexpNumber" runat="server"     
                                ErrorMessage="Numbers only!" 
                                ControlToValidate="txtName"     
                                ValidationExpression="^[0-9]$" />

答案 2 :(得分:0)

验证的最快方法是使用正则表达式。它们更难理解,但提供更好的性能。

但你也可以使用字符串函数。如果你不知道正则表达式但性能较差,这会更容易。这可能是一个可行的选择,取决于验证的难度。

Herehere是一些可以帮助您处理代码示例的帖子。

答案 3 :(得分:0)

哇,这可能是一个非常广泛的话题......

对于数字文本框,您可能应该在KeyPress事件期间限制输入:

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

    Dim allowedChars As String = "0123456789"

    If allowedChars.IndexOf(e.KeyChar) = -1 Then
        ' Invalid Character
        e.Handled = True
    End If

End Sub

注意:此代码示例假设为WinForms,必须使用不同的方法进行Web ...

无论平台形式如何,您都应该查看框架提供的验证控件,这将允许您验证确实存在输入,值在指定范围内,并且还使用正则表达式编写更复杂的验证规则

答案 4 :(得分:0)

同意正则表达式可能更快,但是......好吧,这就是我如何做到的。基本上,此代码用于UserControl,其中包含标签,文本框和错误提供程序。它还有其他各种属性,但这里涉及验证。

我在TextChanged事件中使用它,因为如果用户是无效字符,我不希望用户继续输入;规则检查“吃掉”无效字符。

Public Enum CheckType
    ctString = 0
    ctReal = 1
    ctDecimal = 2
    ctInteger = 3
    ctByte = 4
End Enum

Private mAllowNegative As Boolean = True
Private mAllowNull As Boolean = True
Private mCheckType As CheckType = CheckType.ctString

<System.Diagnostics.DebuggerStepThrough()> _
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    RuleCheckMe()
End Sub

<System.Diagnostics.DebuggerStepThrough()> _
Private Sub RuleCheckMe()
    '// Rule Checking
    If Me.TextBox1.TextLength = 0 Then
        If mAllowNull = False Then
            Me.epMain.SetError(Me.TextBox1, "You are required to provide this value.")
            Me.Valid = False
        Else
            Me.epMain.Clear()
            Me.Valid = True
        End If
    Else
        Select Case mCheckType
            Case CheckType.ctString
                If mInputMask.Length > 0 Then
                    'TODO: Figure out how to cope with input masks!
                    Me.Valid = True
                Else
                    Me.Valid = True
                End If
            Case Else   '// right now we're only testing for numbers...
                If Not IsNumeric(Me.TextBox1.Text) And Me.TextBox1.Text <> "." And Me.TextBox1.Text <> "-" Then
                    If Not String.IsNullOrEmpty(Me.TextBox1.Text) Then
                        Me.TextBox1.Text = Me.TextBox1.Text.Remove(Me.TextBox1.Text.Length - 1, 1)
                        Me.TextBox1.SelectionStart = Me.TextBox1.Text.Length
                    End If
                    Me.epMain.SetError(Me.TextBox1, "This field does not accept non-numeric values.")
                    Me.Valid = False
                ElseIf mAllowNegative = False And Me.TextBox1.Text.StartsWith("-") Then
                    Me.TextBox1.Text = Me.TextBox1.Text.Remove(Me.TextBox1.Text.Length - 1, 1)
                    Me.epMain.SetError(Me.TextBox1, "This field does not accept negative values.")
                    Me.Valid = False
                ElseIf mCheckType = CheckType.ctByte And CType(Me.TextBox1.Text, Integer) > 255 Then
                    Me.epMain.SetError(Me.TextBox1, "This field does not accept values greater than 255.")
                    Me.Valid = False
                Else
                    Me.epMain.Clear()
                    Me.Valid = True
                End If
        End Select
    End If
End Sub

<System.ComponentModel.Browsable(True), _
System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible), _
System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always), _
System.ComponentModel.Category("Data")> _
Public Property AllowNegative() As Boolean
    <System.Diagnostics.DebuggerStepThrough()> _
    Get
        Return mAllowNegative
    End Get
    <System.Diagnostics.DebuggerStepThrough()> _
    Set(ByVal value As Boolean)
        mAllowNegative = value
    End Set
End Property

<System.ComponentModel.Browsable(True), _
System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible), _
System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always), _
System.ComponentModel.Category("Data")> _
Public Property AllowNull() As Boolean
    <System.Diagnostics.DebuggerStepThrough()> _
    Get
        Return mAllowNull
    End Get
    <System.Diagnostics.DebuggerStepThrough()> _
       Set(ByVal value As Boolean)
        mAllowNull = value
    End Set
End Property

<System.ComponentModel.Browsable(True), _
System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Visible), _
System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always), _
System.ComponentModel.Category("Data")> _
Public Property DataTypeCheck() As CheckType
    <System.Diagnostics.DebuggerStepThrough()> _
    Get
        Return mCheckType
    End Get
    <System.Diagnostics.DebuggerStepThrough()> _
       Set(ByVal value As CheckType)
        mCheckType = value
    End Set
End Property

答案 5 :(得分:0)

只需转到文本框的keyup事件并输入以下代码

100%它将起作用

if(Not Char.IsNumber(Chrw(e.Keycode))) Then
    Messagebox.show ("only numeric values ")
    textbox1.text=""
end if                  

答案 6 :(得分:0)

我想分享我的文本框验证器..

    Dim errProvider As New ErrorProvider

' Verify that this field is not blank.
    Private Sub txtValidating(sender As Object,
    e As System.ComponentModel.CancelEventArgs) Handles _
    txtName.Validating, txtStreet.Validating, txtCity.Validating,
    txtState.Validating, txtZip.Validating
        ' Convert sender into a TextBox.
        Dim txt As TextBox = DirectCast(sender, TextBox)
        ' See if it’s blank.
        If (txt.Text.Length > 0) Then
            ' It’s not blank. Clear any error.
            errProvider.SetError(txt, “”)
        Else
            ' It’s blank. Show an error.
            errProvider.SetError(txt, “This field is required.”)
        End If
    End Sub


' See if any field is blank.
    Private Sub Form1_FormClosing(sender As Object,
    e As FormClosingEventArgs) Handles Me.FormClosing
        If (txtName.Text.Length = 0) Then e.Cancel = True
        If (txtStreet.Text.Length = 0) Then e.Cancel = True
        If (txtCity.Text.Length = 0) Then e.Cancel = True
        If (txtState.Text.Length = 0) Then e.Cancel = True
        If (txtZip.Text.Length = 0) Then e.Cancel = True
    End Sub

答案 7 :(得分:0)

Private Sub TxtEmployeenumber_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtEmployeenumber.KeyPress
    Dim c As Char
    c = e.KeyChar
    If Not (Char.IsDigit(c) Or c = "." Or Char.IsControl(c)) Then
        e.Handled = True
        MsgBox("numeric texts only")

    End If
End Sub