Проверка текстового поля - PullRequest
1 голос
/ 12 ноября 2010

Я использую много текстовых полей в форме. Как я проверяю их, В некоторых текстовых полях я должен использовать только текст, а в некоторых - только цифры. Использует ли ASCII правильный метод или есть более простой способ сделать это. Если да, пожалуйста, дайте мне знать код.

Ответы [ 8 ]

7 голосов
/ 12 ноября 2010

Прежде всего, не раздражайте пользователя.Если я набираю какой-то текст, а приложение предотвращает это (независимо от того, как оно это делает), я по праву разозлился.

Есть несколько значений, чтобы справиться с этим:

  • Используйте элемент управления NumericUpDown или Slider вместо текстового поля для числовых значений (другими словами: используйте правильный элемент управления вместо элемента управления общего назначения).

  • Разрешить (более или менее) произвольный ввод и попытаться проанализировать ввод пользователя осмысленным способом.Например, ввод «+33 (0) 6 12-34-56» является полностью значимым форматом для номера телефона во Франции.Приложение должно разрешить это и попытаться правильно его проанализировать.

    Конечно, это самый сложный способ, но он обеспечивает лучший пользовательский опыт.

  • Использование Validating событие для проверки ввода.Это автоматически срабатывает, когда пользователь оставляет элемент управления вводом, т. Е. Когда он закончил свой ввод, и проверка не будет раздражать пользователя.

    Документация MSDNсобытия дает пример того, как это событие используется правильно.

Но не используют события KeyPress или TextChanged для проверки.Первое будет мешать пользователям при вводе текста.Второй также раздражает их, когда они пытаются вставить текст откуда-то еще.Представьте себе следующее: я пытаюсь скопировать номер с веб-сайта.К сожалению, текст, который я скопировал, включает в себя что-то еще, например, «eggs: 14.33 EUR» вместо просто «14.33».

Теперь приложение должно дать мне возможностьвставьте и исправьте текст.Если мне не разрешено это делать, приложение является ошибкой UX.Если приложение использует событие TextChanged, чтобы предотвратить вставку этого текста, у меня нет возможности удалить оскорбительный текст.

1 голос
/ 12 ноября 2010

Текст ограничен 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]$" />
0 голосов
/ 27 января 2017
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
0 голосов
/ 27 июля 2016

Я хотел бы поделиться своим валидатором текстового поля ..

    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
0 голосов
/ 12 мая 2014

просто перейдите к событию keyup текстового поля и введите следующий код

100%, это будет работать

if(Not Char.IsNumber(Chrw(e.Keycode))) Then
    Messagebox.show ("only numeric values ")
    textbox1.text=""
end if                  
0 голосов
/ 12 ноября 2010

Согласился, что регулярные выражения могут быть быстрее, но ... ну, вот как я это сделал.По сути, этот код предназначен для 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
0 голосов
/ 12 ноября 2010

Ого, это может быть очень широкая тема ...

Для числовых текстовых полей вам, вероятно, следует ограничить ввод во время события 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, другой подход должен быть использован для веб ...

Независимо от формы платформы, вы должны изучить элементы управления валидацией, предлагаемые платформой, и это позволит вам проверить, действительно ли есть входные значениянаходятся в указанном диапазоне, а также с помощью регулярных выражений написать более сложные правила проверки.

0 голосов
/ 12 ноября 2010

Самый быстрый способ проверки - использование регулярных выражений. Их сложнее понять, но они предлагают лучшую производительность.

Но вы можете сделать это также с помощью строковых функций. Что проще, если вы не знаете регулярных выражений, но менее эффективно. Это может быть приемлемым вариантом, в зависимости от того, насколько сложна проверка.

Здесь и здесь - некоторые сообщения, которые помогут вам с примерами кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...