Как ограничить щелчки клавиш только цифрами, прежде чем они будут видны в текстовом поле Windows Foms? - PullRequest
0 голосов
/ 20 мая 2018

Мое приложение запрашивает число, которое должно быть ограничено:

Я считаю, что нашел правильный способ реализации большинства требований, используя TextChanged WinForms событие.

Часть, в которой я нуждаюсь в помощи, - это предотвращение любого нецифрового нажатия клавиши, даже с доли секунды.Необходима какая-то эхоподавление / замена.

1 Ответ

0 голосов
/ 20 мая 2018

Вы можете использовать элемент управления NumericUpDown или MaskedTextBox (документ MSDN Пошаговое руководство при его использовании) или, возможно, пользовательский, например, такой CodeProject MaskedEdit элемент управления или другой: FlexMaskEditBox .

Вот реализация руководства , связанная с вашим вопросом:

Во-первых, установите для свойства TextBox MaxLenght значение 3, чтобы оно ограничивало ввод до 3 цифр.

Фильтруйте пользователяНажмите, чтобы принимать только цифры и BackSpace:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar != (char)Keys.Back & !char.IsDigit(e.KeyChar))
        e.Handled = true;
}

Убедитесь, что Keys.D0 не вставлен в первую позицию:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.D0)
    {
        if (textBox1.Text.Length == 0 || textBox1.SelectionStart == 0)
            e.SuppressKeyPress = true;
    }
}

Anti-Paste:отклоняет внезапные изменения в тексте TextBox, если вставленный текст не может быть переведен в число Integer.
Удаляет 0 s в неправильной позиции и другие нецифровые символы:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.Text.Length > 0)
    {
        if (textBox1.Text.Substring(0, 1) == "0")
            textBox1.Text = textBox1.Text.Substring(1);
        else
            if (!int.TryParse(textBox1.Text, out int Number))
            textBox1.Text = string.Empty;
    }
}
...