Не разрешать ноль в текстовом поле - PullRequest
2 голосов
/ 13 мая 2009

Мне нужно текстовое поле, которое только пользователь может разрешить вводить целые числа. Но пользователь не может ввести ноль. он может ввести 10 100 и т. д., а не 0 в одиночку. Как сделать событие в KeyDown?

Ответы [ 5 ]

9 голосов
/ 13 мая 2009

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

В нем также есть отверстия, например, пользователь может ввести «10», а затем удалить «1». Или он мог вставить в «0» - вы разрешаете вставлять, не так ли?

Таким образом, мое решение будет таким: пусть он вводит любую цифру, которая ему нравится, любым способом, и проверяет ввод только после того, как он закончил, например, когда ввод теряет фокус.

6 голосов
/ 13 мая 2009

Почему бы не использовать NumericUpDown и выполнить следующие настройки:

upDown.Minimum = 1;
upDown.Maximum = Decimal.MaxValue;
3 голосов
/ 13 мая 2009

Используйте int.TryParse , чтобы преобразовать текст в число и проверить, не является ли это число 0. Используйте для проверки Проверка .

// this goes to you init routine
textBox1.Validating += textBox1_Validating;

// the validation method
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    if (textBox1.Text.Length > 0)
    {
        int result;
        if (int.TryParse(textBox1.Text, out result))
        {
            // number is 0?
            e.Cancel = result == 0;
        }
        else
        {
            // not a number at all
            e.Cancel = true;
        }
    }
}

EDIT:

Хорошо, поскольку вы используете WPF, вам следует взглянуть на то, как реализовать проверку правильности пути WPF . Вот класс проверки, который реализует вышеуказанную логику:

public class StringNotZeroRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (textBox1.Text.Length == 0)
            return new ValidationResult(true, null);

        int result;
        if (int.TryParse(textBox1.Text, out result))
        {
            // number is 0?
            if (result == 0)
            {
                return new ValidationResult(false, "0 is not allowed");
            }
        }
        else
        {
            // not a number at all
            return new ValidationResult(false, "not a number");
        }

        return new ValidationResult(true, null);
    }
}
1 голос
/ 13 мая 2009

Это еще одна вариация на тему:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    char newChar = Convert.ToChar(e.KeyValue);
    if (char.IsControl(newChar))
    {
        return;
    }
    int value;
    e.SuppressKeyPress = int.TryParse((sender as TextBox).Text + newChar.ToString(), out value) ? value == 0 : true;
}
0 голосов
/ 13 мая 2009
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (textBox1.Text == "" && e.KeyChar == '0')
        {
            e.Handled = true;
            return;
        }
        if (e.KeyChar < '0' || e.KeyChar > '9')
        {
            e.Handled = true;
            return;
        }

    }

не приятно, но работает

...