2009-03-05 5 views

Répondre

13

Ne pas oublier les questions suivantes/coin-cas que vous serez confrontés si vous allez votre itinéraire proposé:

  • Les utilisateurs peuvent utiliser Ctrl - V ou Maj - Insérer pour coller des valeurs "invalides" dans (Cette seconde est un peu plus difficile à attraper) ... mais les utilisateurs devraient probablement être autorisés à coller des valeurs légales dans le contrôle
  • Les utilisateurs peuvent faire un clic droit, coller des valeurs invalides en usi ng le menu contextuel par défaut
  • Même si vous avez essayé de résoudre le problème précédent en donnant à la zone de texte son propre menu contextuel, les utilisateurs peuvent cliquer en dehors de votre contrôle, maintenir le bouton droit, glisser sur votre zone de texte et laisser aller pour accéder au menu contextuel par défaut (et collez-le dans des valeurs non valides)
  • Quel que soit le traitement clé que vous ne devez pas désactiver les combinaisons de touches comme Alt - F4, etc. (et oui, vous briser si vous définir SuppressKeyPress pour tout ce qui n'est pas un chiffre valide)
  • Les utilisateurs devraient probablement être en mesure d'entrer des valeurs partielles (par ex."-.", car ils commencent à taper "-.23") sans votre zone de texte les punir
  • nombres comme "-.1e-2" pourrait être considéré comme légal
  • Un utilisateur peut réalistement entrer une valeur qui ne contient que des chiffres, mais qui provoque un débordement d'un float
  • Le le pire de tous: Un autre cas de coin mystérieux que vos utilisateurs trouveront après que vous avez livré (!!)

La morale? Il peut être très difficile de faire ce que vous suggérez.

Vous avez probablement soit envie de faire une combinaison des éléments suivants:

  • Utilisez un contrôle que quelqu'un qui connaît tous les cas de coin construits (comme Microsoft)
  • Effectuer une validation de base en cas TextChanged (et faire quelque chose de passif, comme changer la couleur de fond de zone de texte)
  • Enregistrer la validation jusqu'à ce que vous essayez réellement d'utiliser la valeur qu'ils ont tapés dans
  • Utilisez les bibliothèques système pour Parse la valeur de l'utilisateur pour vous
+0

Gah, tant de cas de bord à prendre en charge. Je déteste les utilisateurs ...;) –

+0

@ecarF: Sans blague; C'est pourquoi il est si difficile de construire un contrôle d'entrée robuste comme le demande le PO. –

+0

Oui, attendez que l'utilisateur termine ce qu'il fait (appuyez sur OK), puis augmentez la valeur avec une regex et continuez ou lancez un MessageBox. Beaucoup plus agréable que de surcharger OnKeyPress. – Karl

2

Jetez un coup d'œil au contrôle MaskedTextBox. Il hérite également de TextBoxBase et a probablement la fonctionnalité que vous construisez dans le vôtre.

+0

Merci pour la réponse rapide, Mike. En fait, j'ai fait des recherches sur le contrôle MaskedTextBox avant de recourir au travail manuel, mais je ne pouvais pas le faire fonctionner comme je le voulais avec des nombres à virgule flottante. Peut-être que j'ai fait quelque chose d'idiot, cependant ... –

+0

Je ne pense pas que MaskedTextBox puisse faire quelque chose de bien ici, car il ne semble pas autoriser un nombre infini de caractères (définis par l'utilisateur). –

0

Je ne pense pas que la roue a été inventée encore (au moins dans le cadre .NET). Je suis sûr qu'il y a quelque chose sur CodeProject ou similaire, qui ressemble à ce que vous êtes, donc ça vaut peut-être Google.

Le levage lourd ne devrait pas être trop incroyablement mauvais cependant. Il y a un peu plus à cela qu'à première vue.

L'exemple trop simplifié est que vous pouvez gérer OnKeyPress, faire un Float.TryParse avec le nouveau caractère ajouté. Si vrai, maintenez la touche; Si la valeur est false, annulez-la (e.Handled = true). La partie difficile est de savoir si elles suppriment, coupent ou collent une sélection. L'autre chose est quand ils sont juste de commencer (vous voudrez peut-être accepter « - » entrée valide partielle) ...

+0

http://www.codeproject.com/KB/edit/RegexText.aspx semblent le faire. –

+0

Merci pour votre suggestion, mais ce n'est pas si simple. Que faire si l'utilisateur change la position des carets? Autant que je puisse voir, vous ne pouvez pas aveuglément ajouter. –

+0

Merci pour le lien VirualBlackFox. Je vais certainement jeter un coup d'oeil. –

0

Ou vérifier correspondance utilisant

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(..) // your condition 
    { 
    e.SuppressKeyPress = false; 
    } 
    else 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

ou

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method 
} 
1

Pourquoi ne pas utiliser NumericUpDown?

0

J'ai découvert la propriété ValidatingType d'un MaskedTextBox:

maskedTextBox1.ValidatingType = typeof(System.Double); 

Il ne vous dit en effet, que ce soit valide ou non. Malheureusement, il ne semble que valider lorsque le focus change (et même alors, il ne fait rien réellement); mais peut-être y a-t-il un moyen de l'utiliser.

+0

Vous pouvez appeler la méthode "ValidateText" quand vous le souhaitez. Donc, pour s'éloigner de la restriction de changement de focus, définissez un gestionnaire pour TextChanged, et dites si (maskedTextBox1.MaskCompleted) {maskedTextBox1.ValidateText(); } – CJBrew

0

Est-il nécessaire de faire la validation pendant la saisie des données, ou pouvez-vous vous permettre de vérifier la valeur finale entrée une fois que la mise au point est perdue? Dans ce dernier cas, vous pouvez également utiliser un contrôle ErrorProvider pour limiter les fonctionnalités jusqu'à ce que l'entrée soit résolue.

+0

Merci, je suppose que j'aurais dû mieux expliquer. Je valide l'entrée de l'utilisateur lors de la saisie des données. –

Questions connexes