Проверка TextBox в VB.NET и Windows Forms - PullRequest
2 голосов
/ 05 марта 2009

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

Я попробовал пару вещей, и они сработали, но до последней цифры (после десятичной точки), то есть она не позволяет удалить после того, как число полностью введено. номер вводится в формате: 12313213.45

Что мне делать?

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

    'validation '
    Dim KeyAscii As Short = Asc(e.KeyChar)
    If Not ((KeyAscii >= System.Windows.Forms.Keys.D0 And KeyAscii <= System.Windows.Forms.Keys.D9) Or (KeyAscii = System.Windows.Forms.Keys.Back) Or Chr(KeyAscii) = "." Or (Chr(KeyAscii) Like "[ ]")) Then
        KeyAscii = 0
        TextBox5.Focus()
    End If
    If KeyAscii = 0 Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") >= 0 And e.KeyChar = "." Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") > 0 Then
        If TextBox5.SelectionStart > TextBox5.Text.IndexOf(".") Then
            If TextBox5.Text.Length - TextBox5.Text.IndexOf(".") = 3 Then
                e.Handled = True
            End If
        End If
    End If
End Sub

Ответы [ 7 ]

2 голосов
/ 05 марта 2009

Еще лучший способ - использовать элемент управления, который поддерживает десятичные дроби (если вы используете что-то вроде инфрагистики, componentone, devexpress и т. Д.). Пользователь получает визуальные подсказки и может делать аккуратные вещи, например нажимать стрелки для продвижения цифры.

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

Лично я нахожу это HUGELY раздражающим, когда приложения пытаются исправить меня, и я не закончил ввод данных. Гораздо удобнее позволить пользователю закончить, а затем уведомить его, если возникнут какие-либо проблемы.

2 голосов
/ 05 марта 2009

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

Попытка проверить нажатие клавиши по нажатию клавиши вызовет у вас много головной боли.

1 голос
/ 11 ноября 2009
txtMobil.Text = Format(txtMobil.Text, "###-###-####")
0 голосов
/ 07 ноября 2009

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

If Textbox5.Text.IndexOf(".") > 0 Then
    If Textbox5.SelectionStart > Textbox5.Text.IndexOf(".") Then
        If Textbox5.Text.Length - Textbox5.Text.IndexOf(".") = 3 Then
            If KeyAscii <> System.Windows.Forms.Keys.Back Then e.Handled = True
        End If
    End If
End If
0 голосов
/ 28 августа 2009

Или используйте регулярное выражение для сложных вещей

0 голосов
/ 07 марта 2009

Я думаю, что ссылка ниже должна дать вам именно то, что вы ищете:

Числовой TextBox

Хотя для выполнения проверки при каждом нажатии клавиши требуется значительное количество кода, это, безусловно, возможно, и приведенный выше код, по-видимому, обрабатывает удаление, возврат, возврат / копирование и вставку и т. Д.

0 голосов
/ 05 марта 2009

Не пытайтесь проверять нажатия клавиш по одному.
1) Вы только что обнаружили, что Backspace требует больше кода, теперь добавлена ​​поддержка вырезания / копирования и вставки, а клавиша удаления и ввод текста заменяют выделение. Код не очень хороший.
2) Это только смущает пользователя. Или хуже, они пытаются и введите. отделив дату в поле, вы вводите эту дату в допустимое число, игнорируя второе. и теперь они ввели что-то совершенно неверное, и ваша программа не скажет им.
Событие проверки текстового поля - то, куда должна идти эта логика. Он срабатывает, когда фокус перемещается на другой элемент управления (свойство CausesValidation которого имеет значение true, это позволяет нажимать кнопки отмены, даже если текущий элемент управления не находится в допустимом состоянии).
В проверяющем событии вы можете выполнить все необходимые проверки и отменить событие, если данные неверны, а также отобразить любое сообщение, которое вам нужно. Чтобы проверить значение, я бы предложил начать с Single.TryParse, а затем, если преобразование выполнится успешно, вы можете продолжить выполнять любые проверки диапазона, которые вам требуются. TryParse лучше, чем совет @ Bork, потому что он легче читается и позволяет избежать выброса / отлова ненужных исключений.

РЕДАКТИРОВАТЬ: только что заметил, что вы также ограничивает длину введенного текста. Вы можете сделать это, установив свойство MaxLength в TextBox.

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