Domanda

Devo essere in grado di bloccare i caratteri validi in una casella di testo, al momento ho una regex su cui posso confrontare ogni personaggio come

  

[A-Za-z]

si bloccherebbe solo ai caratteri 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;
    }
  }
}

Avevo inserito il codice regex nel codice OnKeyPress, ma ho permesso a tutti i tasti speciali, come Ctrl-V, Ctrl-C e Backspace di essere ammessi.

Come puoi vedere, ho la chiave backspace gestita. Tuttavia, Ctrl-V, ad esempio, non può vedere il tasto V perché viene eseguito una volta per il tasto ctrl ma non vede alcun tasto modificatore.

Qual è il modo migliore per gestire questa situazione?

È stato utile?

Soluzione

È possibile utilizzare uno degli eventi OnKeyPress / OnKeyUp / OkKeyDown e quindi utilizzare il metodo Char.IsLetter per verificare che la chiave immessa sia una lettera.

Altri suggerimenti

MaskedTextBox potrebbe essere giusto per te.

Puoi anche dare un'occhiata al FilterTextBox su CodeProjct. Puoi usarlo (o l'approccio descritto) per fare ciò che intendi. L'idea di base è annullare la modifica prima che diventi visibile (tramite un evento OnTextChanging).

Cosa succede se si inserisce la convalida in OnTextChanged anziché in OnKeyPress, ma ogni volta che passa la convalida si salva il valore in una variabile? Quindi puoi ripristinare se l'utente incolla o digita una stringa errata, oltre a dare qualche altro suggerimento all'interfaccia utente che qualcosa non era valido (ad esempio impostare il testo di un'etichetta).

Perché non metti il ??segno di spunta per i caratteri validi nell'evento OnTextChanged

e quindi gestisci Ctrl + C, Ctrl + V nel tasto on in basso

Inoltre puoi usare e.ModifierKeys == Keys.Control per testare i tasti di controllo

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

La soluzione che ho escogitato è quella di controllare i tasti nell'evento OnKeyDown e quindi impostare un flag se si deve gestire la pressione dei tasti, che viene quindi verificata nell'evento 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;
    }
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top