Winforms TextBox - разрешить только цифры или 1 десятичное место - PullRequest
1 голос
/ 21 ноября 2011

Как запретить пользователям вводить что-либо, кроме числового значения или десятичного значения с 1 десятичным знаком?

Пользователь должен иметь возможность вводить любую длину символов (если десятичное значение, до десятичного).

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011

Попробуйте использовать Regex. Этот шаблон должен работать: Regex match = new Regex(@"^[1-9]\d*(\.\d{1})?$"), укажите это в проверяющем событии текстового поля. Если совпадение отсутствует, Undo() или удалите свойство Textbox.Text.

    Regex match = new Regex(@"^[1-9]\d*(\.\d{1})?$");

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (!match.IsMatch(textBox1.Text))
        {
            textBox1.Undo(); 
        }
    }

Чтобы немедленно отменить ввод, вы должны использовать

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (!match.IsMatch(textBox1.Text))
        {
            textBox1.Undo();
        }
    }

Потому что, если вы используете KeyDown, TextBox не имеет состояния отмены.

2nd Edit: Если вы хотите, чтобы оба случая совпадали, вы должны выполнить проверку в Validating Event или аналогичную. Поскольку регулярное выражение использует «$», чтобы убедиться, что в конце не добавляются никакие символы, вы не можете ввести «.» иначе у вас получится число, например 1., что потребует дополнительной проверки.

0 голосов
/ 07 января 2016

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

Imports System.Runtime.InteropServices
Imports System.Drawing.Imaging
Imports System.ComponentModel
Imports System.Text.RegularExpressions


<ToolboxBitmap(GetType(System.Windows.Forms.TextBox))> _
Public Class NumericTextBox
    Inherits TextBox

    Dim _TextBoxValue As String
    Dim _CaretPosition As Integer

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        MyBase.OnKeyDown(e)
        _TextBoxValue = Me.Text
        _CaretPosition = Me.SelectionStart
    End Sub
    Protected Overrides Sub OnKeyUp(e As KeyEventArgs)
        MyBase.OnKeyUp(e)

        If (Me.Text.Length = 0) Or (Me.Text = _TextBoxValue) Then Exit Sub
        If IsNumeric(Me.Text) Then

            If Me.Text.EndsWith(".") Then
                Me.Text = Convert.ToDecimal(Me.Text) & "."
            Else
                Me.Text = Convert.ToDecimal(Me.Text)
            End If

        Else
            Me.Text = _TextBoxValue
        End If
        Me.SelectionStart = _CaretPosition + 1
    End Sub
End Class
0 голосов
/ 21 июля 2015

Соответствие регулярному выражению = новое регулярное выражение (@ "^ [1-9] \ d * (. \ D {1})? $"); Работает правильно

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