2008-09-16 6 views

Répondre

8

Regardez le contrôle "NumericUpDown". Il a une validation de gamme, l'entrée sera toujours numérique, et il a ces astucieux boutons d'incrémentation/décrémentation.

0

Vous pouvez utiliser une zone de texte régulière et un contrôle Validator pour contrôler l'entrée. Essayez d'utiliser un contrôle fournisseur d'erreur pour valider la zone de texte.

+0

Uniquement dans ASP.Net. S'il était un développeur MFC, il pense probablement à des formes gagnantes. –

0

Vous pouvez utiliser int.TryParse() ou double.TryParse() pour vérifier si elle est numérique, puis valider la plage.

0

Vous pouvez utiliser une combinaison des RequiredFieldValidator et CompareValidator (Set à DataTypeCheck pour l'opérateur et définissez le type entier)

Cela va obtenir avec une zone de texte normal si vous voulez, sinon la recommandation ci-dessus est bon .

1

J'ai dû implémenter un contrôle qui n'acceptait que des nombres, entiers ou réels. Je construis le contrôle comme une spécialisation du contrôle TextBox (lu: dérivé de), et utilise un contrôle d'entrée et une expression régulière pour la validation. L'ajout de la validation de plage est terriblement simple.

Ceci est le code pour construire la regex. _numericSeparation est une chaîne de caractères acceptés comme décimal virgule valeurs (par exemple, un ou « » « »: 10,50 $ 10,50 €

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 (toute chaîne avec numérique Une fois que vous avez créé l'expression régulière (lors de l'instanciation du contrôle), vous vérifiez si la valeur est correcte override la méthode OnValidating CheckValidNumber() applique simplement Regex au texte introduit.Si la correspondance de 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 nombre est dans la fourchette 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'aident aussi à prévenir l'utilisateur à partir des données d'entrée dans la zone de texte autre que caracteres numérique Redéfinition de la methdod de 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 valide tous les le temps que l'utilisateur relâche une touche, de sorte que l'utilisateur peut obtenir des commentaires en cours de frappe. (Mais rappelez-vous que vous devez être prudent avec l'événement ValidationFail;))

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