Question

Je suis un programmeur MFC qui débute avec C # et qui recherche un contrôle simple qui permettra la saisie de numéros et la validation de plages.

Était-ce utile?

La solution

Consultez l’onglet "NumericUpDown". contrôle. Il a une plage de validation, l'entrée sera toujours numérique et il possède ces boutons astucieux d'incrémentation / décrémentation.

Autres conseils

J'ai dû implémenter un contrôle qui n'accepte que des nombres, des entiers ou des réels. Je construis le contrôle en tant que spécialisation du contrôle TextBox (lire: dérivé) et en utilisant le contrôle d'entrée et une expression régulière & # 243; n pour la validation. Ajouter la validation de plage est terriblement facile.

Ceci est le code pour construire la regex. _numericSeparation est une chaîne avec des caractères acceptés comme virgule décimale (par exemple, un '.' ou un ',': 10,50 $ 10,50 & # 8364;

private string ComputeRegexPattern()
{
   StringBuilder builder = new StringBuilder();
   if (this._forcePositives)
   {
       builder.Append("([+]|[-])?");
   }
   builder.Append(@"[\d]*((");
   if (!this._useIntegers)
   {
       for (int i = 0; i < this._numericSeparator.Length; i++)
       {
           builder.Append("[").Append(this._numericSeparator[i]).Append("]");
           if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
           {
               builder.Append("|");
           }
       }
   }
   builder.Append(@")[\d]*)?");
   return builder.ToString();
}

L'expression régulière correspond à n'importe quel nombre (c'est-à-dire n'importe quelle chaîne avec des caractères numériques) avec un seul caractère comme séparation numérique et un caractère optionnel '+' ou '-' au début de la chaîne. Une fois la regex créée (lors de l’instanciation du contrôle), vous vérifiez si la valeur est correcte en remplaçant la méthode OnValidating. CheckValidNumber () applique simplement l'expression rationnelle au texte introduit. Si la correspondance regex échoue, active un fournisseur d'erreur avec une erreur spécifiée (définie avec la propriété publique ValidationError) et déclenche un événement ValidationError. Ici, vous pouvez faire la vérification pour savoir si le numéro est dans la plage requise.

private bool CheckValidNumber()
{
   if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
   {
       this._errorProvider.SetError(this, this.ValidationError);
       return false;
   }
   this._errorProvider.Clear();
   return true;
}

protected override void OnValidating(CancelEventArgs e)
{
   bool flag = this.CheckValidNumber();
   if (!flag)
   {
      e.Cancel = true;
      this.Text = "0";
   }
   base.OnValidating(e);
   if (!flag)
   {
      this.ValidationFail(this, EventArgs.Empty);
   }
}

Comme je l’ai dit, j’empêche également l’utilisateur de saisir des données dans la zone de texte autres que les caractères numériques remplaçant le méthdod OnKeyPress:

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
    {
        e.Handled = true;
    }
    if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
    {
        e.Handled = true;
    }
    if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
    {
        e.Handled = true;
    }
    base.OnKeyPress(e);
}

La touche élégante: je vérifie si le numéro est valide chaque fois que l'utilisateur relâche une touche, afin que l'utilisateur puisse obtenir un retour au fur et à mesure qu'il tape. (Mais rappelez-vous que vous devez être prudent avec l'événement ValidationFail;))

protected override void OnKeyUp(KeyEventArgs e)
{
    this.CheckValidNumber();
    base.OnKeyUp(e);
}

Vous pouvez utiliser une zone de texte standard et un contrôle Validator pour contrôler la saisie.

Essayez d’utiliser un contrôle fournisseur d’erreurs pour valider la zone de texte. Vous pouvez utiliser int.TryParse () ou double.TryParse () pour vérifier si elle est numérique, puis valider la plage.

Vous pouvez utiliser une combinaison de RequiredFieldValidator et CompareValidator (définie sur DataTypeCheck pour l'opérateur et Type définie sur Integer)

Cela correspondra à une zone de texte normale si vous le souhaitez, sinon la recommandation ci-dessus est bonne.

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