Blocco dei caratteri validi in una casella di testo
-
05-07-2019 - |
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?
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;
}
}