2008-10-31 11 views
1

je dois être en mesure de verrouiller les caractères valides dans une zone de texte, j'ai actuellement un regex que je peux vérifier chaque caractère contre tels queVerrouillage des caractères valides dans une zone de texte

[A-Za z]

verrouillerait uniquement les caractères alpha.

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Back) 
    { 
    base.OnKeyPress(e); 
    return; 
    } 
    if (String.IsNullOrEmpty(this._ValidCharExpression)) 
    { 
    base.OnKeyPress(e); 
    } 
    else 
    { 
    bool isValidChar = Regex.Match(e.KeyChar.ToString(),this._ValidCharExpression).Success; 
    if (isValidChar) 
    { 
     base.OnKeyPress(e); 
    } 
    else 
    { 
     e.Handled = true; 
    } 
    } 
} 

j'avais placé le code regex dans le code OnKeyPress, mais je wat pour permettre à toutes les touches spéciales, telles que Ctrl-V, pour être autorisé Ctrl-C et Backspace.

Comme vous pouvez le voir, j'ai la touche de retour arrière en cours de traitement. Cependant, Ctrl-V, par exemple, ne peut pas voir la clé V parce qu'elle s'exécute une seule fois pour la clé ctrl mais ne voit aucune clé de modification.

Quelle est la meilleure façon de gérer cette situation?

+0

Le faire manuellement chez KeyPresses est HARD. Vous pouvez, mais vous devez vous rappeler d'autoriser toutes les touches de contrôle (retour arrière, supprimer, etc.). Si vous y parvenez, mettez-le au moins dans un nouveau contrôle dérivé de TextBox afin de pouvoir le réutiliser. Ou mieux, lisez la réponse de Tomalak - c'est la bonne façon. :) –

Répondre

0

Vous pouvez utiliser l'un des événements OnKeyPress/OnKeyUp/OkKeyDown, puis utiliser la méthode Char.IsLetter pour vérifier que la clé entrée est une lettre.

2

si vous mettez la validation OnTextChanged au lieu de OnKeyPress, mais chaque fois qu'il passe la validation que vous enregistrez la valeur à une variable? Vous pouvez ensuite rétablir si l'utilisateur colle ou tape une chaîne incorrecte, ainsi que donner une indication d'invalidité de l'interface utilisateur (par exemple, définir le texte d'un label).

4

MaskedTextBox peut être bon pour vous. Vous pouvez également consulter le FilterTextBox sur CodeProjct. Vous pouvez l'utiliser (ou l'approche décrite) pour faire ce que vous voulez. L'idée de base est d'annuler la modification avant qu'elle ne devienne visible (via un événement OnTextChanging).

0

La solution que j'ai trouvée est de vérifier les clés dans l'événement OnKeyDown et de définir un drapeau si la touche doit être manipulée, qui est alors vérifier dans l'événement OnKeyPress.

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    Keys keyCode = (Keys)e.KeyValue; 
    base.OnKeyDown(e); 
    if ((e.Modifiers == Keys.Control) || 
     (e.Modifiers == Keys.Control) || 
     (keyCode == Keys.Back) || 
     (keyCode == Keys.Delete)) 
    { 
     this._handleKey = true; 
    } 
    else 
    { 
     // check if the key is valid and set the flag 
     this._handleKey = Regex.Match(key.ToString(), this._ValidCharExpression).Success; 
    } 
    } 




protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
    if (this._handleKey) 
    { 
     base.OnKeyPress(e); 
     this._handleKey = false; 
    } 
    else 
    { 
     e.Handled = true; 
    } 
    }