Pergunta

Eu preciso de uma caixa de texto que só o usuário pode permitir a entrar inteiros. Mas o usuário não pode entrar zero. ou seja, ele pode entrar 10.100 etc. Não 0 sozinho. Como posso fazer evento em KeyDown?

Foi útil?

Solução

A forma como pretende fazer isso, é muito chato para um usuário. Você está adivinhando o que um usuário quer entrar, e agir de acordo com o seu palpite, mas você pode ser tão errado.

Ele também tem buracos, por exemplo, um usuário pode digitar "10" e exclua a "1". Ou ele poderia colar em um "0" - você não permitir colar, não é

Assim, a minha solução seria: deixá-lo entrar a qualquer dígito que ele gosta, do jeito que ele gosta, e validar única após ele terminou, por exemplo, quando a entrada perde o foco

Outras dicas

Por que não usar um NumericUpDown e faça as seguintes configurações:

upDown.Minimum = 1;
upDown.Maximum = Decimal.MaxValue;

Use int.TryParse para converter o texto em um número e verificar se esse número não é 0. Use o evento Validando para a verificação.

// 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:

Tudo bem, desde que você use WPF você deve dar uma olhada em como implementar validação maneira WPF. Aqui está uma classe de validação que implementa a lógica acima:

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);
    }
}

Esta é uma outra variação sobre o tema:

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;
}
    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;
        }

    }

Não é agradável, mas funciona

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top