Può essere utile, per alcune applicazioni aggiungere una funzionalità di selezione automatica del testo, quando il fuoco viene attivato su di un controllo MaskedTextBox.
Apparentemente la soluzione sembra banale: chiamare il metodo SelectAll() del controllo, sull'evento OnEnter. Però questa soluzione non funziona, per ragioni di design infatti l'implementazione del controllo sovrascrive questa operazione subito dopo l'esecuzione dell'evento.
Per ovviare a questo problema basta semplicemente "posticipare" l'esecuzione dell'operazione SelectAll() eseguendola in modo asincrono con una BeginInvoke.
Esempio di codice gestione evento
OnEnter() utilizzando una
lambda expression
private void mtxCognome_Enter(object sender, EventArgs e)
{
BeginInvoke((MethodInvoker)(() => mtxCognome.SelectAll()));
}
Una soluzione alternativa è quella di implementare un controllo personalizzato estendendo il controllo MaskedTextBox ed implementando la funzione virtuale OnEnter() nonchè parametrizzando il compotamento attraverso una proprietà.
Esempio di codice di estensione controllo
MaskedTextBox
public class MaskedTextBoxEx : MaskedTextBox
{
...
public bool AutoSelectAllOnEnter = true;
protected override void OnEnter(EventArgs e)
{
if (AutoSelectAllOnEnter)
{
BeginInvoke((MethodInvoker) (SelectAll));
}
base.OnEnter(e);
}
}
Ed ecco il risultato in un applicazione d'esempio