Question

Je dois pouvoir verrouiller les caractères valides dans une zone de texte. Je dispose actuellement d'une expression régulière sur laquelle je peux vérifier chaque caractère, par exemple

.
  

[A-Za-z]

serait verrouillé pour ne contenir que des 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 de regex dans le code OnKeyPress, mais je souhaitais autoriser toutes les touches spéciales, telles que Ctrl-V, Ctrl-C et Backspace.

Comme vous pouvez le constater, la touche Retour arrière est gérée. Cependant, Ctrl-V, par exemple, ne peut pas voir la touche V car elle s’exécute une fois pour la touche ctrl mais ne voit aucune touche de modificateur.

Quel est le meilleur moyen de gérer cette situation?

Était-ce utile?

La solution

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.

Autres conseils

MaskedTextBox peut être bon pour vous.

Vous pouvez également consulter la FilterTextBox dans CodeProjct. Vous pouvez l'utiliser (ou l'approche décrite) pour faire ce que vous souhaitez. L’idée de base est d’annuler la modification avant qu’elle ne devienne visible (via un événement OnTextChanging).

Que se passe-t-il si vous mettez la validation dans OnTextChanged au lieu de OnKeyPress, mais chaque fois que la validation est réussie, vous enregistrez la valeur dans une variable? Vous pouvez ensuite rétablir si l'utilisateur colle ou tape une chaîne incorrecte, ainsi que donner à un autre indicateur de l'interface utilisateur un élément non valide (par exemple, définir le texte d'une étiquette).

Pourquoi ne cochez-vous pas les caractères valides dans l'événement OnTextChanged

puis traiter avec les touches Ctrl + C, Ctrl + V dans la touche d'activation enfoncée

Vous pouvez également utiliser e.ModifierKeys == Keys.Control pour tester les clés de contrôle

.

http://msdn.microsoft.com /en-us/library/system.windows.forms.keypresseventargs.aspx

La solution que j’ai trouvée est de vérifier les clés dans l’événement OnKeyDown, puis de définir un indicateur si la frappe doit être gérée, qui est ensuite enregistrée 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;
    }
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top