Указать ввод символов только в текстовом поле +, чтобы можно было использовать ярлыки

Я хочу иметь текстовое поле в C#, которое принимает только цифры. Мой способ сделать это:

    private void textBoxStart_KeyPress(object sender, KeyPressEventArgs e)
    {
        char i = e.KeyChar;

        if (!((i >= '0' && i <= '9') || i == 8))
            e.Handled = true;
    }

Работает нормально. Но я хочу иметь возможность использовать ярлыки (например, Ctrl + V). Как мне это сделать?

редактировать

Я хотел упростить мою проблему. Но ответ типа "использовать numericUpDown" обязывает меня показать все проблемы. Именно проблема состоит в том, чтобы иметь возможность принимать все цифры, прописные и строчные буквы. NumericUpDown принимает только номер;p

редактировать 2

Я делаю это в приложении WinForms.

6 ответов

Вместо этого используйте поле NumericUpDown.

Поднятый из простого числового текстового поля, вот основная процедура:

private void textBox1_KeyDown(object sender, KeyEventArgs e) {
  bool numOK = ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 ||
                 e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) &&
                 e.Modifiers != Keys.Shift);

  bool editOK = ((e.Control && e.KeyCode == Keys.V) ||
                 (e.Control && e.KeyCode == Keys.C) ||
                 (e.Control && e.KeyCode == Keys.X) ||
                 (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back));

  bool moveOK = (e.KeyCode == Keys.Up ||
                 e.KeyCode == Keys.Right ||
                 e.KeyCode == Keys.Down ||
                 e.KeyCode == Keys.Left ||
                 e.KeyCode == Keys.Home ||
                 e.KeyCode == Keys.End);

  if (!(numOK || editOK || moveOK)) {
    e.SuppressKeyPress = true;
    e.Handled = true;
  }
}

Конечно, ограничивая ввод с клавиатуры только цифрами, но используя Control-Paste, у вас есть проблема с контролем того, что конечный пользователь вставляет, что может быть строками. Если вам это нужно, посмотрите на связанный проект - вам нужно переопределить WndProc и перехватить команду вставки, а затем проверить содержимое буфера обмена. Это потребует от вас сделать свой собственный контроль, где вы наследуете от TextBox.

Смотрите это: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b95b5197-e695-4e46-ae0c-9575c7c80c5b/

Вы можете использовать обработчик событий Validating или TextChanged для проверки ввода после ввода. Для этой задачи регулярные выражения должны быть хорошими. Это не идеально, так как прерывает взаимодействие с пользователем.

Я не могу придумать простой возможности отклонить недопустимые символы сразу. Вы должны подождать, пока элемент управления не потеряет фокус или что-то в этом роде.

Затем вы можете попробовать MaskedTextBox, но маска не может принимать произвольное количество символов.

Проверьте специфическое для silverlight числовое текстовое поле. Хотя это Silverlight-Specific, это должно работать для всего кода C#.

Как создать числовое текстовое поле в Silverlight?

Я закончил тем, что использовал реализацию Sameh Serag и немного изменил ее, чтобы установить максимум / мин. Это сработало довольно хорошо.

Зачем воссоздавать колесо? Вы должны проверить замаскированное текстовое поле в наборе инструментов WPF.

Вы должны посмотреть на этот ТАК вопрос. похоже на твою проблему.

Вы можете использовать это, хотя это, вероятно, излишнее...

if (Regex.IsMatch(subjectString, @"[a-z\d]", RegexOptions.IgnoreCase)) {
        // Successful match
}
Другие вопросы по тегам