J'ai une application Windows Forms avec un contrôle de zone de texte que je souhaite accepter uniquement des valeurs entières. Dans le passé, j'ai fait ce type de validation en surchargeant l'événement KeyPress et en supprimant simplement les caractères qui ne correspondaient pas aux spécifications. J'ai regardé le contrôle MaskedTextBox mais j'aimerais une solution plus générale qui pourrait fonctionner avec peut-être une expression régulière, ou dépendre des valeurs d'autres contrôles.
Idéalement, cela se comporterait de telle sorte que la pression d'un caractère non numérique ne produirait aucun résultat ou fournirait immédiatement à l'utilisateur des commentaires sur le caractère non valide.
Réponses:
Deux options:
Utilisez
NumericUpDown
plutôt un . NumericUpDown fait le filtrage pour vous, ce qui est bien. Bien sûr, cela donne également à vos utilisateurs la possibilité d'appuyer sur les flèches haut et bas du clavier pour augmenter et diminuer la valeur actuelle.Gérez les événements de clavier appropriés pour empêcher autre chose que la saisie numérique. J'ai eu du succès avec ces deux gestionnaires d'événements sur une TextBox standard:
Vous pouvez supprimer la vérification
'.'
(et la vérification ultérieure de plusieurs'.'
) si votre TextBox ne doit pas autoriser les décimales. Vous pouvez également ajouter une vérification pour savoir'-'
si votre TextBox doit autoriser des valeurs négatives.Si vous souhaitez limiter l'utilisateur pour le nombre de chiffres, utilisez:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
la source
Et juste parce qu'il est toujours plus amusant de 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 moyen sûr de désinfecter vos données.
la source
KeyPress
événements de la même zone de texte. Un événement peut être définie.Handled
sur true, puis un autre peut le définir sur false. En général, il vaut mieux utiliserif (...) e.Handled = true;
TextChanged
événement qui le dépasse avec une expression régulière peut corriger le copier-coller;)Je suppose à partir du contexte et des balises que vous avez utilisées que vous écrivez une application .NET C #. Dans ce cas, vous pouvez vous abonner à l'événement de modification de texte et valider chaque coup de touche.
la source
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Voici un simple contrôle personnalisé Winforms autonome, dérivé de la TextBox standard, qui autorise uniquement l'entrée System.Int32 (il pourrait être facilement adapté pour d'autres types tels que System.Int64, etc.). Il prend en charge les opérations de copier / coller et les nombres négatifs:
Mise à jour 2017 : Ma première réponse a quelques problèmes:
J'ai donc proposé une autre version plus générique, qui prend toujours en charge le copier / coller, les signes + et -, etc.
Pour Int32, vous pouvez en dériver, comme ceci:
ou sans dérivation, utilisez le nouvel événement TextValidating comme ceci:
mais ce qui est bien, c'est que cela fonctionne avec n'importe quelle chaîne et toute routine de validation.
la source
C'est exactement pour cela que les événements validés / validants ont été conçus.
Voici l'article MSDN sur le sujet: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
La version TL; DR: vérifiez la propriété .Text dans l'événement Validating et définissez
e.Cancel=True
lorsque les données ne sont pas valides.Lorsque vous définissez e.Cancel = True, l'utilisateur ne peut pas quitter le champ, mais vous devrez lui donner une sorte de rétroaction indiquant que quelque chose ne va pas. Je change la couleur d'arrière-plan de la boîte en rouge clair pour indiquer un problème. Assurez-vous de le
SystemColors.Window
redéfinir lorsque la validation est appelée avec une bonne valeur.la source
Validating
.<nitpick>
L'OP mentionne qu'interdire / indiquer immédiatement un caractère invalidant est idéal, maisValidating
semble exiger que le focus soit déplacé vers un autre formulaire / contrôle avant qu'il ne prenne effet.</nitpick>
Pourtant, c'est une excellente approche et mérite toujours d'être considérée dans le cas plus général.Essayez une MaskedTextBox . Il prend un format de masque simple afin que vous puissiez limiter l'entrée aux nombres ou aux dates ou autre chose.
la source
Vous pouvez utiliser l'
TextChanged
événementla source
Undo()
, mais il en résulte unStackOverflowException
.public int txtBoxValue
, et si tryParse ne fonctionne pas, je rétablis le texte dans txtBox partxtBox.Text = txtBoxValue.ToString();
Cela pourrait être utile. Il permet des valeurs numériques "réelles", y compris les décimales appropriées et les signes plus ou moins précédents. Appelez-le depuis l'événement KeyPress associé.
la source
J'ai travaillé sur une collection de composants pour compléter les éléments manquants dans WinForms, le voici: Formulaires avancés
En particulier, c'est la classe d'un Regex TextBox
Ajouter simplement quelque chose comme ça
myNumbericTextBox.RegexString = "^(\\d+|)$";
devrait suffire.la source
Utilisez simplement une
NumericUpDown
commande et définissez la laideur de la visibilité des boutonsfalse
.NumericUpDown
est en fait une collection de contrôles contenant une «zone de sélection numérique» (boutons haut / bas), une zone de texte et du code pour valider et balancer tout cela ensemble.Marquage:
masquera les boutons tout en gardant le code sous-jacent actif.
Sans être une solution évidente, elle est simple et efficace.
.Controls[1]
masquerait la partie de la zone de texte si vous vouliez le faire à la place.la source
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 enregistré. Si quelque chose ne va pas, la dernière bonne valeur sera restaurée. La source est un peu trop volumineuse pour être publiée ici, mais voici un lien vers la classe qui gère le cœur de cette logique.
la source
utilisez simplement ce code dans la zone de texte:
la source
Dans notre page Web avec la définition de zone de texte, nous pouvons ajouter un
onkeypress
événement pour accepter uniquement les numéros. Il ne montrera aucun message mais il vous évitera une mauvaise saisie. Cela a fonctionné pour moi, l'utilisateur ne pouvait rien saisir sauf le numéro.la source
vous pouvez utiliser l' événement TextChanged / Keypress, utiliser une expression régulière pour filtrer les nombres et prendre des mesures.
la source
Je le gérerais dans l'événement KeyDown.
la source
essayez c'est très simple
la source
Jeter un coup d'œil à gestion des entrées dans WinForm
J'ai publié ma solution qui utilise les événements ProcessCmdKey et OnKeyPress sur la zone de texte. Les commentaires vous montrent comment utiliser une Regex pour vérifier la pression de touche et bloquer / autoriser de manière appropriée.
la source
Salut, vous pouvez faire quelque chose comme ça dans l'événement textchanged de la zone de texte.
voici une démo
la source
Il semble que la plupart des réponses actuelles à cette question analysent manuellement le texte saisi. Si vous recherchez un type numérique intégré spécifique (par exemple
int
oudouble
), pourquoi ne pas simplement déléguer le travail à laTryParse
méthode de ce type ? Par exemple:Si vous voulez quelque chose de plus générique mais toujours compatible avec Visual Studio's Designer:
Et enfin, si vous voulez quelque chose de complètement générique et que vous ne vous souciez pas du support de Designer:
la source
Les nombres entiers et flottants doivent être acceptés, y compris les nombres négatifs.
la source
Voici mon approche:
et tous les numéros de taille
la source
En utilisant l'approche décrite dans la réponse de Fabio Iotti, j'ai créé une solution plus générique:
"ValidatedTextBox", qui contient tous les comportements de validation non triviaux. Il ne reste plus qu'à hériter de cette classe et remplacer la méthode "IsValid" avec la logique de validation requise. Par exemple, en utilisant cette classe, il est possible de créer "RegexedTextBox" qui n'acceptera que les chaînes qui correspondent à une expression régulière spécifique:
Après cela, héritant de la classe "RegexedTextBox", nous pouvons facilement créer des contrôles "PositiveNumberTextBox" et "PositiveFloatingPointNumberTextBox":
la source
Désolé de réveiller les morts, mais j'ai pensé que quelqu'un pourrait trouver cela utile pour référence future.
Voici comment je le gère. Il gère les nombres à virgule flottante, mais peut facilement être modifié pour les nombres entiers.
Fondamentalement, vous ne pouvez appuyer que sur 0 - 9 et .
Vous ne pouvez avoir qu'un seul 0 avant le .
Tous les autres caractères sont ignorés et la position du curseur est conservée.
Voici une version int rapidement modifiée:
la source
Celui-ci fonctionne avec le copier-coller, le glisser-déposer, la touche enfoncée, empêche le débordement et est assez simple
la source
N'oubliez pas qu'un utilisateur peut coller un texte invalide dans un fichier
TextBox
.Si vous souhaitez restreindre cela, suivez le code ci-dessous:
la source
Je cherchais également la meilleure façon de vérifier uniquement les nombres dans la zone de texte et le problème avec la pression de touche était qu'il ne prend pas en charge le copier-coller par un clic droit ou un presse-papiers.J'ai donc trouvé ce code qui valide le moment où le curseur quitte le champ de texte et vérifie également champ vide. (version adaptée de newguy)
la source
la source
3 solution
1)
2) une autre solution de msdn
}
la source http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) à l'aide de MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
la source
En cliquant sur le bouton, vous pouvez vérifier le texte de la zone de texte par pour la boucle:
la source
Réponse plus simple:
la source