3 votes

Boîte de texte avec uniquement des chiffres

Je dois créer une zone de texte avec uniquement des chiffres mais je n'ai pas réussi. J'ai essayé de mettre : InputScope = "Numbers" mais cela ne fonctionne que sur mobile. J'ai également essayé ceci sur TextChanging:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
    {
        textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
    }
}

8voto

MZetko Points 1612

Vous pouvez soit empêcher toute saisie non numérique, soit simplement filtrer les chiffres dans le texte.

Prévention de la saisie non numérique

Utilisez l'événement BeforeTextChanging:

Et gérez-le de cette manière :

private void TextBox_OnBeforeTextChanging(TextBox sender,
                                          TextBoxBeforeTextChangingEventArgs args)
{
    args.Cancel = args.NewText.Any(c => !char.IsDigit(c));
}

Cette expression LINQ renverra true et donc Cancel le changement de texte en cas de rencontre de tout caractère non numérique dans l'entrée.

Filtrage de la saisie non numérique

Utilisez l'événement TextChanging:

Et gérez-le de cette manière :

private void TextBox_OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
    //Sauvegardez la position de la sélection, pour éviter que le curseur ne saute au début
    int pos = sender.SelectionStart;
    sender.Text = new String(sender.Text.Where(char.IsDigit).ToArray());
    sender.SelectionStart = pos;
}

Cette requête LINQ filtrera les caractères non numériques et créera une nouvelle string uniquement avec les chiffres de l'entrée.

Il est préférable d'utiliser TextChanging et BeforeTextChanging, car TextChanged se produit trop tard, et l'utilisateur serait confus en voyant temporairement des caractères s'afficher à l'écran pour disparaître immédiatement.

0voto

FiveFour Points 1

Basé sur la réponse https://stackoverflow.com/a/52624310/13814517 pour cette question.

Si vous souhaitez également autoriser des entrées comme 100.0, vous pourriez rencontrer un problème avec le point décimal.

  1. activer l'événement privé OnBeforeTextChanging sur la zone de texte
  2. dans le gestionnaire :

    private void TextBox_OnBeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args) { double tempDouble; args.Cancel = !(double.TryParse(args.NewText, out tempDouble) | args.NewText == "");

    }

-1voto

Azhy Points 616

Vous pouvez faire quelque chose d'autre à la place de la fonction TextBox.Text.Remove qui est la fonction Substring et vous devriez également la corriger lorsqu'ils copient une série de caractères qui inclut des lettres au centre de la chaîne :

private void textBox1_TextChanged(object sender, EventArgs e)
{
    var txt = textBox1.Text;

        if (System.Text.RegularExpressions.Regex.IsMatch(txt, "[^0-9]"))
        {
            for (int i = 0; i < txt.Length; i++)
                if (!char.IsDigit(txt[i]))
                    if (i != txt.Length - 1)
                    {
                        //Si une chaîne incluant des lettres au milieu a été collée
                        //Supprimer le caractère du milieu ou supprimer tout le texte et demander un nombre en entrée
                        //J'ai choisi la deuxième option
                        textBox1.Text = "";
                        break;
                    }
                    else
                    {
                        //Si une lettre a juste été tapée à la fin du texte
                        textBox1.Text = txt.Substring(0, txt.Length - 1);
                        break;
                    }
        }
}

-1voto

VD26 Points 116

Voici une solution O(1) sans correspondance de chaîne de caractères

    bool textCanceled = false;

    private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (!Char.IsDigit((char)e.Key))
            textCanceled = true;
        else
            textCanceled = false;

    }

    private void TextBox_BeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args)
    {
        args.Cancel = textCanceled;
    }

Il pourrait être nécessaire de gérer le caractère de retour arrière comme un cas spécial

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X