укажите ввод символов только в текстовом поле +, чтобы можно было использовать ярлыки - PullRequest
1 голос
/ 15 ноября 2011

Я хочу иметь текстовое поле в 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 ]

1 голос
/ 15 ноября 2011

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

0 голосов
/ 15 ноября 2011

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

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.

0 голосов
/ 15 ноября 2011

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

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

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

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

0 голосов
/ 15 ноября 2011

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

if (Regex.IsMatch(subjectString, @"[a-z\d]", RegexOptions.IgnoreCase)) {
        // Successful match
}
0 голосов
/ 15 ноября 2011

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

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

0 голосов
/ 15 ноября 2011

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

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

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

...