Question

J'ai besoin une zone de texte qui seul l'utilisateur peut permettre d'entrer des nombres entiers. Mais l'utilisateur ne peut pas entrer à zéro. i.e., il peut entrer dans 10100, etc. Non 0 seul. Comment puis-je faire événement KeyDown?

Était-ce utile?

La solution

La façon dont vous envisagez de faire, est très gênant pour un utilisateur. Vous devinons ce que l'utilisateur veut entrer et agir sur votre estimation, mais vous pouvez être si mal.

Il a également des trous, par exemple, un utilisateur peut entrer « 10 », puis supprimer le « 1 ». Ou il pourrait coller dans un « 0 » - vous ne laissez la pâte, ne pas

Alors, ma solution serait la suivante: qu'il entre un chiffre qu'il aime, de la façon qu'il aime, et valider l'entrée que après il a fini, par exemple, lorsque l'entrée perd le focus

Autres conseils

Pourquoi ne pas utiliser un NumericUpDown et effectuez les réglages suivants:

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

Utilisez int.TryParse pour convertir le texte en nombre et vérifier si ce nombre est différent de 0. Utilisez le événement pour validation du chèque.

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

D'accord, puisque vous utilisez WPF, vous devriez jeter un oeil à la façon de mettre en œuvre validation du WPF façon . Voici une classe de validation qui implémente la logique ci-dessus:

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

Ceci est une autre variation sur le thème:

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

    }

pas agréable, mais cela fonctionne

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top