Domanda

Ho bisogno di una casella di testo, che solo l'utente può permettere di inserire numeri interi. Ma l'utente non può inserire zero. cioè, può entrare 10,100 ecc Non 0 da solo. Come posso fare evento KeyDown?

È stato utile?

Soluzione

Il modo in cui si pensa di fare questo, è molto fastidioso per un utente. Si sta indovinando ciò che un utente vuole entrare, e agire su tuo indovinare, ma si può essere così sbagliato.

Ha anche fori, per esempio, un utente può inserire "10" e quindi eliminare il "1". Oppure potrebbe incollare in uno "0" -? Lo fai consentire pasta, non è vero

Quindi la mia soluzione potrebbe essere: lasciarlo entrare qualsiasi cifra che gli piace, in qualsiasi modo che gli piace, e convalidare l'ingresso solo dopo ha finito, per esempio, quando l'ingresso perde lo stato attivo

Altri suggerimenti

Perché non si usa un NumericUpDown ed effettuare le seguenti impostazioni:

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

int.TryParse per convertire il testo in un numero e verificare se tale numero non è 0. Utilizzare il Convalida evento per il controllo.

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

Modifica

D'accordo, dal momento che si utilizza WPF si dovrebbe dare un'occhiata a come implementare convalida WPF modo . Qui è una classe di convalida che implementa la logica di cui sopra:

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

Questa è un'altra variazione sul 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;
        }

    }

Non è bello, ma funziona

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top