我在表单中使用了很多文本框。 我如何验证它们, 在某些文本框中,我只需要使用文本,而在某些文本框中我只能使用数字。 使用ASCII是一种正确的方法还是有更简单的方法来做到这一点。如果是这样,请让我知道编码。
答案 0 :(得分:7)
最重要的是,不要惹恼用户。如果我正在键入一些文本并且应用程序阻止了(不管它是怎么做的),我理所当然地生气。
有多个值可以解决这个问题:
使用NumericUpDown
或Slider
控件而不是文本框作为数值(换句话说:使用正确的控件而不是通用控件)。
允许(或多或少)任意输入并尝试以有意义的方式解析用户输入。例如,输入“+33 (0) 6 12-34-56
”对于法国的电话号码来说是完全有意义的格式。应用程序应该允许,并尝试正确解析它。
当然,这是最难的方式,但它提供了最佳的用户体验。
使用Validating
事件验证输入。只要用户离开输入控件,即当他们完成他们的输入时,就会自动触发,并且验证不会惹恼用户。
该事件的MSDN文档提供了如何正确使用此事件的示例。
但不使用KeyPress
或TextChanged
事件进行验证。第一个会在输入文本时打扰用户。当他们尝试从其他地方粘贴文本时,第二个也会惹恼他们。想象一下:我正在尝试从网站上复制一个数字。不幸的是,我复制的文字也包含其他内容,例如: “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)
验证的最快方法是使用正则表达式。它们更难理解,但提供更好的性能。
但你也可以使用字符串函数。如果你不知道正则表达式但性能较差,这会更容易。这可能是一个可行的选择,取决于验证的难度。
答案 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