Comment puis-je faire une zone de texte qui accepte uniquement les numéros?
J'ai une application windows forms avec un contrôle de zone de texte que je veux de n'accepter que des valeurs entières. Dans le passé, j'ai fait ce genre de validation par la surcharge de l'événement KeyPress et simplement la suppression des caractères qui ne correspondent pas à la spécification. J'ai regardé le contrôle MaskedTextBox mais j'aimerais plus générale de la solution qui pourrait fonctionner avec peut-être une expression régulière, ou dépendent des valeurs des autres contrôles.
Dans l'idéal, ce serait de se comporter tel qu'en appuyant sur un non numérique caractère ne produire aucun résultat ou immédiatement fournir à l'utilisateur avec des commentaires sur le caractère incorrect.
- des chiffres ou des chiffres? grande différence: même les nombres entiers peuvent aller négatif
- La question a été prévu pour les nombres, y compris l'ensemble des nombres rationnels.
Vous devez vous connecter pour publier un commentaire.
Deux options:
Utiliser un
NumericUpDown
à la place. NumericUpDown le filtrage pour vous, ce qui est agréable. Bien sûr, il donne également aux utilisateurs la capacité de frapper les flèches haut et bas du clavier pour incrémenter et décrémenter la valeur actuelle.Gérer le clavier événements empêcher quoi que ce soit mais d'entrée numérique. J'ai eu du succès avec ce deux gestionnaires d'événements sur une zone de texte standard:
Vous pouvez désactiver la case pour
'.'
(et le contrôle a posteriori pour plus d'un'.'
) si votre zone de texte ne devrait pas permettre décimales. Vous pouvez également ajouter une case pour'-'
si votre zone de texte doit permettre à des valeurs négatives.Si vous souhaitez limiter l'utilisateur pour le nombre de chiffres à utiliser:
textBox1.MaxLength = 2; //this will allow the user to enter only 2 digits
if (!char.IsControl(e.KeyChar)
TextChanged()
maintenant, au lieu deKeyPress()
?Et juste parce que c'est toujours plus de plaisir à faire des choses en une seule ligne...
REMARQUE: Cela N'empêche PAS un utilisateur de Copier /Coller dans cette zone de texte. Ce n'est pas un fail safe façon de désinfecter vos données.
KeyPress
des événements à partir de la même zone de texte. Un événement pourrait définire.Handled
de vrai, et puis un autre pourrait la définir à faux. En général, il est préférable d'utiliserif (...) e.Handled = true;
TextChanged
événement qui va dessus avec une regex peut fixer copier-coller 😉Je suis en supposant que, de contexte et les balises que vous avez utilisé que vous écrivez .NET application en C#. Dans ce cas, vous pouvez vous abonner au texte modifié de l'événement, et de valider chaque touche.
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Ici est une simple autonome Winforms de contrôle personnalisé, dérivé de la zone de texte standard, qui permet à seul Système.Int32 entrée (il peut être facilement adapté à d'autres types tels que Système.Int64, etc.). Il prend en charge les opérations copier/coller et les nombres négatifs:
Mise à jour en 2017: Ma première réponse a certaines questions:
Alors je suis venu avec une autre version plus générique, qui soutient encore le copier/coller, + et - signe, etc.
Pour Int32, vous pouvez en tirer, comme ceci:
ou w/o dérivation, utilisez la nouvelle TextValidating événement comme celui-ci:
mais ce qui est bien c'est qu'il fonctionne avec n'importe quelle chaîne, et de toute routine de validation.
C'est exactement ce que l'Validé/Validation des événements ont été conçus pour.
Voici l'article MSDN sur le sujet: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Le TL;DR version: vérifier l' .Propriété du texte dans la Validation de l'événement et de définir
e.Cancel=True
lorsque les données n'est pas valide.Lorsque vous définissez e.Cancel=True, l'utilisateur ne peut pas quitter le terrain, mais vous aurez besoin de leur donner un certain type de commentaires que quelque chose ne va pas. - Je changer la couleur d'arrière-plan à la lumière rouge pour indiquer un problème. Assurez-vous de la définir à
SystemColors.Window
lors de la Validation est appelée avec une bonne valeur.Validating
.<nitpick>
L'OP mentionne que, immédiatement interdisant/indiquant un caractère invalidant est idéal, maisValidating
semble exiger que les focus être déplacé vers une autre forme de contrôle/avant qu'elle ne prenne effet.</nitpick>
Encore, c'est une bonne approche et toujours utile d'envisager dans le cas plus général.Essayer un MaskedTextBox. Il prend un simple masque de format de sorte que vous pouvez limiter la saisie de nombres ou de dates ou de quoi que ce soit.
Vous pouvez utiliser le
TextChanged
événementUndo()
, mais il en résulte uneStackOverflowException
.public int txtBoxValue
, et si tryParse ne fonctionne pas, je reviens de texte dans txtBox partxtBox.Text = txtBoxValue.ToString();
Ça peut être utile. Il permet de "vraies" valeurs numériques, y compris le point décimal et le précédent signes plus ou moins. Appel à partir de l'intérieur de la relative événement KeyPress.
J'ai travaillé sur une collection de composants manquants trucs en WinForms, elle est ici: Les Formes Avancées
En particulier, c'est la classe Regex zone de texte
Simplement en ajoutant quelque chose comme
myNumbericTextBox.RegexString = "^(\\d+|)$";
devrait suffire.J'ai fait quelque chose pour cela sur CodePlex.
Il fonctionne en interceptant l'événement TextChanged. Si le résultat est un bon nombre, il sera stocké. Si c'est quelque chose de mal, la dernière bonne valeur sera restauré. La source est un peu trop grand pour publier ici, mais voici un lien vers la catégorie qui gère la base de cette logique.
simplement utiliser ce code dans la zone de texte :
Dans notre site web, avec la définition de la zone de texte, on peut ajouter une
onkeypress
événement pour accepter uniquement des chiffres. Il n'affiche aucun message, mais il va vous empêcher de saisie erronée. Il a travaillé pour moi, l'utilisateur ne pourrait pas entrer quoi que ce soit sauf le nombre.Il suffit d'utiliser un
NumericUpDown
de contrôle et de définir ces affreux en place à l'aide des boutons de la visibilité àfalse
.NumericUpDown
est en fait une collection de contrôles contenant un "spin box" (de haut en bas les boutons), une zone de texte et un peu de code pour valider et wange-sonner ensemble.Marquage:
permet de masquer les boutons tout en gardant le code sous-jacent actif.
Bien que n'étant pas une solution évidente, c'est simple et efficace.
.Controls[1]
permettrait de masquer la zone de texte de la partie si vous avez voulu faire à la place.vous pouvez utiliser TextChanged/événement Keypress, utiliser une regex pour filtrer sur les chiffres et prendre des mesures.
essayez c'est très simple
Prendre un coup d'oeil à De gérer les entrées en WinForm
J'ai posté ma solution qui utilise le ProcessCmdKey et OnKeyPress événements sur la zone de texte. Les commentaires vous montrer comment utiliser une Regex pour vérifier la pression de touche et de bloquer/autoriser de manière appropriée.
Salut vous pouvez faire quelque chose comme cela dans l'événement textchanged de la zone de texte.
voici une démo
Il semble que de nombreuses réponses à cette question sont manuellement l'analyse du texte d'entrée. Si vous êtes à la recherche pour un intégré de type numérique (par exemple,
int
oudouble
), pourquoi ne pas déléguer le travail à ce type deTryParse
méthode? Par exemple:Si vous voulez quelque chose de plus générique, mais toujours compatible avec Visual Studio Designer:
Et enfin, si vous voulez quelque chose de complètement générique et ne se soucient pas de la prise en charge du Concepteur:
Deux nombres entiers et décimaux doivent être acceptées, y compris les nombres négatifs.
En utilisant l'approche décrite dans Fabio Iotti réponse j'ai créé un plus solution générique:
"ValidatedTextBox", qui contient tous les non trivial de validation de comportement.
Tout ce qui reste à faire est d'hériter de cette classe et de remplacer "IsValid" avec quelle que soit la logique de validation est nécessaire.
Par exemple, l'utilisation de cette classe, il est possible de créer des "RegexedTextBox" qui accepte uniquement les chaînes en fonction de l'expression régulière:
Après cela, l'héritage du "RegexedTextBox" de classe, nous pouvons facilement créer des "PositiveNumberTextBox" et "PositiveFloatingPointNumberTextBox" contrôles:
Désolé de réveiller les morts, mais je pensais que quelqu'un pourrait trouver cela utile pour référence future.
Ici est la façon dont je le manipuler. Il gère les nombres à virgule flottante, mais peut facilement être modifié pour les entiers.
Fondamentalement, vous ne pouvez appuyez sur 0 - 9 et .
Vous ne pouvez avoir qu'un 0 avant la .
Tous les autres caractères sont ignorés et la position du curseur maintenu.
Ici est rapidement modifié int version:
Je voudrais y faire face dans l'événement KeyDown.
Celui-ci fonctionne avec le copier-coller, glisser-déposer, enfoncée, empêche le dépassement de capacité et est assez simple
Ne pas oublier qu'un utilisateur peut coller une défaillance de texte dans un
TextBox
.Si vous souhaitez restreindre l', suivez le code ci-dessous:
J'étais également à la recherche de la meilleure façon de vérifier uniquement des chiffres dans la zone de texte et le problème avec keypress est qu'il ne supporte pas de copier coller par clic droit ou presse-papiers afin de trouvé ce code qui valide lorsque le curseur quitte le champ de texte et aussi il vérifie pour champ vide. (adapté de la version de newguy)
3 solution
1)
2)
une autre solution à partir de msdn
}
source http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) à l'aide de la MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
Bouton de clic, vous pouvez vérifier le texte de la textbox par boucle for:
Plus simple de répondre:
FAIL-SAFE et simple "récursive" la méthode, qui peut être utilisé avec plusieurs zones de texte.
Il bloque le mauvais clavier les caractères tapés et aussi collé valeurs, etc. Il n'accepte que des nombres entiers, et le nombre maximum de longueur est la longueur maximale d'une chaîne de type (qui est de type int, très longue!)
j'aime laconique code
J'avais créé un Ré-Utilisable Textbox Extension classe pour toutes sortes de validations et de la pensée sur le partage.
Tout ce que vous devez faire est de soulever un TextChange événement, puis d'appeler la méthode de validation. Il ressemble à ceci:
Ici est la classe d'extension:
Vous trouverez le code complet ici
C'est mon approche:
et de toute taille numéros de