Указать ввод символов только в текстовом поле +, чтобы можно было использовать ярлыки
Я хочу иметь текстовое поле в 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 ответов
Поднятый из простого числового текстового поля, вот основная процедура:
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
}