Как заставить Textbox принимать только буквенные символы - PullRequest
3 голосов
/ 26 апреля 2009

У меня есть приложение Windows Forms с элементом управления maskedtextbox, в котором я хочу принимать только буквенные значения.

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

Ответы [ 7 ]

6 голосов
/ 26 апреля 2009

Этот вопрос, вероятно, задавался и отвечался миллион раз на всех мыслимых форумах по программированию. Каждый предоставленный ответ отличается от заявленных требований.

Поскольку вы используете MaskedTextBox, вам доступны дополнительные функции проверки, и вам не нужно обрабатывать нажатия клавиш. Вы можете просто установить для свойства Mask что-то вроде «L» (требуется символ) или «?» (необязательные символы). Чтобы показать пользователю обратную связь о том, что ввод недопустим, вы можете использовать свойство BeepOnError или добавить всплывающую подсказку, чтобы отобразить сообщение об ошибке. Этот механизм обратной связи должен быть реализован в обработчике событий MaskedInputRejected.

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

Если вам все еще нужно обрабатывать события нажатия клавиш, тогда читайте дальше ...!

Метод, который я бы порекомендовал в вашем случае, состоит в том, что вместо обработки события KeyDown (якобы вам не нужна расширенная обработка ключей) или использования регулярных выражений для сопоставления ввода (откровенно говоря, излишнее), я бы просто использовал встроенные свойства структуры Char.

private void maskedTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
  Char pressedKey = e.KeyChar;
  if (Char.IsLetter(pressedKey) || Char.IsSeparator(pressedKey) || Char.IsPunctuation(pressedKey))
  {
    // Allow input.
    e.Handled = false
  }
  else
    // Stop the character from being entered into the control since not a letter, nor punctuation, nor a space.
    e.Handled = true;
  }
}

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

4 голосов
/ 26 апреля 2009

С MSDN (Этот код показывает, как обрабатывать событие KeyDown для проверки введенного символа. В этом примере он проверяет только числовой ввод. Вы можете изменить его так, чтобы он работал для буквенного ввода вместо числового):

// Boolean flag used to determine when a character other than a number is entered.
private bool nonNumberEntered = false;

// Handle the KeyDown event to determine the type of character entered into the control.
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Initialize the flag to false.
    nonNumberEntered = false;

    // Determine whether the keystroke is a number from the top of the keyboard.
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
    {
        // Determine whether the keystroke is a number from the keypad.
        if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
        {
            // Determine whether the keystroke is a backspace.
            if(e.KeyCode != Keys.Back)
            {
                // A non-numerical keystroke was pressed.
                // Set the flag to true and evaluate in KeyPress event.
                nonNumberEntered = true;
            }
        }
    }
    //If shift key was pressed, it's not a number.
    if (Control.ModifierKeys == Keys.Shift) {
        nonNumberEntered = true;
    }
}

// This event occurs after the KeyDown event and can be used to prevent
// characters from entering the control.
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    // Check for the flag being set in the KeyDown event.
    if (nonNumberEntered == true)
    {
        // Stop the character from being entered into the control since it is non-numerical.
        e.Handled = true;
    }
}
3 голосов
/ 11 июля 2011
// This is  to allow only numbers.
// This Event Trigger, When key press event occures ,and it only allows the Number and Controls., 
private void txtEmpExp_KeyPress(object sender, KeyPressEventArgs e)
{
    if(Char.IsControl(e.KeyChar)!=true&&Char.IsNumber(e.KeyChar)==false)
    {
        e.Handled = true;
    }
}

//At key press event it will allows only the Characters and Controls.
private void txtEmpLocation_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Char.IsControl(e.KeyChar) != true && Char.IsNumber(e.KeyChar) == true)
    {
        e.Handled = true;
    }
}
3 голосов
/ 26 апреля 2009

Этот код будет отличать нажатия букв алфавита от не алфавита:

private void maskedTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Regex.IsMatch(e.KeyChar.ToString(), @"\p{L}"))
    {
        // this is a letter
    }
    else
    {
        // this is NOT a letter
    }
}

Обновление: обратите внимание, что вышеприведенный шаблон регулярных выражений будет соответствовать ТОЛЬКО буквенным символам, поэтому он не будет содержать пробелы, запятые, точки и т. Чтобы разрешить больше видов символов, вам нужно добавить их в шаблон:

// allow alphabetic characters, dots, commas, semicolon, colon 
// and whitespace characters
if (Regex.IsMatch(e.KeyChar.ToString(), @"[\p{L}\.,;:\s]"))
1 голос
/ 05 октября 2011

// Добавить текстовое поле, выбрать его и перейти к Событиям и В списке событий дважды щелкнуть событие «нажатие клавиши».

        if (!char.IsLetter(e.KeyChar))
        {
            MessageBox.Show("Enter only characters");
        }
    }
0 голосов
/ 01 июля 2016

Попробуйте этот код

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !(char.IsLetter(e.KeyChar) || e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Space);
    }
0 голосов
/ 12 сентября 2013

Это работает для меня :)

    private void txt_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !((e.KeyChar != 'ñ' && e.KeyChar != 'Ñ') && char.IsLetter(e.KeyChar));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...