Текстовое поле принимает только точки (.) И Da sh (-) - PullRequest
0 голосов
/ 23 марта 2020

Я попробовал несколько кодов, но не сработало

Например, я нашел это, и оно не сработало:

        if (!char.IsControl(e.KeyChar) 
        && !char.IsDigit(e.KeyChar) 
        && e.KeyChar != '.')
    {
        e.Handled = true;
    }

    // only allow one decimal point
    if (e.KeyChar == '.' 
        && (sender as TextBox).Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }

1 Ответ

0 голосов
/ 23 марта 2020

У вас очень простая, но понятная ошибка.

Для свойства Handled в KeyPressEventArgs должно быть установлено значение true, чтобы не допустить дальнейшей обработки ключа операционной системой.

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.keypresseventargs?view=netframework-4.8

Другими словами, установите для этого параметра значение true, если вы хотите ПРЕДОТВРАТИТЬ ключ.

Поэтому измените свой код таким образом, чтобы РАЗРЕШИТЬ дальнейшую обработку, когда нажатая клавиша соответствует условиям.

Также посмотрите, как вводятся логические переменные, чтобы сделать код читабельным.

Приведенный ниже код позволяет

  • A (- ), если это первый символ в текстовом поле
  • Символ (.), если это не первый символ и если нет других точек
  • Любые управляющие символы
  • И любые цифры.

Удачи.

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        bool isControl = char.IsControl(e.KeyChar);
        bool isDigit = char.IsDigit(e.KeyChar);
        bool isDot = e.KeyChar == '.';
        bool alreadyHasADot = (sender as TextBox).Text.IndexOf('.') != -1;
        bool isHyphen = e.KeyChar == '-';
        bool isFirstChar = (sender as TextBox).Text.Length == 0;

        bool isAllowed =
            isControl ||
            isDigit ||
            (isDot && !isFirstChar && !alreadyHasADot) ||
            (isHyphen && isFirstChar);

        if (!isAllowed)
        {
            e.Handled = true;
        }
    }
...