Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Lavorare con i text box

C#

Alcune proprietà importanti

  • CharacterCasing: per convertire i carattari inseriti in maiuscolo / minuscolo.
  • PasswordChar: per nascondere i caratteri inseriti con un altro carattere, per esempio '*'.
  • ReadOnly: per rendere la TextBox non editabile dall'utente.
  • ShortcutsEnabled: per abilitare / disabilitare il funzionamento delle scorciatoie, tra cui Copia, Taglia, Incolla.


Conversione di caratteri

  • Aggiungere il codice seguente nell'evento KeyPress del text box e modificare l'evento opportunamente. In questo esempio viene fatta una conversione in maiuscolo, anche se è meglio impostare la proprietà opportuna (vedi paragrafo precedente).
  • L'esempio mostra anche come permettere all'utente la digitazione di certi caratteri (il Backspace e il Canc) e come impedire gli altri con la proprietà 'e.Handled = true'.
  • Non dimenticare anche di impedire all'utente l'utilizzo del Copia / Taglia / Incolla con la proprietà del paragrafo precedente.

   private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
   {
       if (Char.IsLetter(e.KeyChar))
           e.KeyChar = Char.ToUpper(e.KeyChar);
       else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
       { }
       else
           e.Handled = true;
   }

  • Nel caso di conversioni in maiuscolo o minuscolo, impostare la proprietà 'CharacterCasing'.

Inserimento solo di cifre
  • Aggiungere il codice seguente nell'evento KeyPress del text box.

   private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
   {
       if (Char.IsNumber(e.KeyChar))
       { }
       else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
       { }
       else
           e.Handled = true;
   }

Inserimento solo di numeri telefonici
  • Aggiungere il codice seguente nell'evento KeyPress del text box.

   private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
   {
       if (Char.IsNumber(e.KeyChar))
       { }
       else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
       { }
       else if (e.KeyChar == '.')
       { }
       else if (e.KeyChar == '/')
       { }
       else if (e.KeyChar == '-')
       { }
       else
           e.Handled = true;
   }

Intercettare la pressione di un tasto
  • Per esempio, per intercettare il 'Return' aggiungere nell'evento KeyDown() del controllo:

   if (e.KeyCode == Keys.Return)
       { }

Inserimento di un numero decimale
  • Nei programmi di tipo gestionale, spesso è necessario introdurre un controllo TextBox che accetti l'inserimento di un numero decimale, magari controllando il numero di cifre intere e il numero di cifre decimali.
  • Una prima soluzione può essere trovata utilizzando il controllo MaskedTextBox. Esso permette di definire una 'maschera' di inserimento ed è molto utile in tutti i casi dove la maschera è fissa (cioè il campo sia riempito esattamente senza spazi o vuoti). Il suo utilizzo per l'inserimenti di numeri decimali non è del tutto soddisfacente.
  • La soluzione qua proposta utilizza invece il classico TextBox.
  • In questo esempio:
    • Si ha il TextBox txt1 e si vuole controllare che l'utente scriva:
    • Si vuole che l'utente scriva al massimo 5 cifre intere e 2 cifre decimali.
    • Si vuole che l'utente possa utilizzare indifferentemente come separatore decimale la virgola o il punto.
  • Si definiscono le seguenti due variabili a livello di form:

   int cifreIntere = 5;
   int cifreDecimali = 2;

  • Nell'evento Form_Load() o nelle proprietà del TextBox, si imposta:

   private void Form1_Load(object sender, EventArgs e)
   {
       txt1.MaxLength = cifreIntere + cifreDecimali + 1;
   }

  • Si definisce la seguente funzione con due overload. Può essere definita in una classe pubblica oppure nella stessa classe del form dove è collocato il TextBox da controllare.

   public static bool CheckDecimalNumber(string textActual, int selStart, int selLength,
          char charToInsert, int maxIntegerDigits, int maxDecimalDigits)
   {
       // Restituisce true se si può inserire il carattere nel testo e rimane un numero decimale consentito.
       // textActual: testo prima di inserire il carattere.
       // selStart: punto di inserimento del cursore.
       // selLength: lunghezza della selezione se presente.
       // charToInsert: carattere da inserire.
       // maxIntegerDigits: massimo numero di cifre intere consentite.
       // maxDecimalDigits: massimo numero di cifre decimali consentite.

       // Elimina la parte selezionata e inserisce il carattere in inserimento.
       if (selLength > 0)
       {
           textActual = textActual.Remove(selStart, selLength).Insert(selStart, charToInsert.ToString());
       }
       else
       {
           textActual = textActual.Insert(selStart, charToInsert.ToString());
       }

       // Sostituisce la ',' con il '.'.
       textActual = textActual.Replace(',', '.');

       // Non più di un punto.
       if (textActual.Count(p => p == '.') > 1)
           return false;

       // Non eccede il numero di cifre intere e decimali.
       if (textActual.Contains('.'))
       {
           if (textActual.Substring(0, textActual.IndexOf('.')).Length > maxIntegerDigits)
           {
               return false;
           }
           if (textActual.Substring(textActual.IndexOf('.') + 1).Length > maxDecimalDigits)
           {
               return false;
           }
       }
       else if (textActual.Length > maxIntegerDigits)
       {
           return false;
       }

       return true;
   }

   public static bool CheckDecimalNumber(string text, int maxIntegerDigits, int maxDecimalDigits)
   {
       // Restituisce true se il testo rappresenta un numero decimale consentito.
       // text: testo da validare.
       // maxIntegerDigits: massimo numero di cifre intere consentite.
       // maxDecimalDigits: massimo numero di cifre decimali consentite.

       // Sostituisce la ',' con il '.'.
       text = text.Replace(',', '.');

       // Non più di un punto.
       if (text.Count(p => p == '.') > 1)
           return false;

       // Non eccede il numero di cifre intere e decimali.
       if (text.Contains('.'))
       {
           if (text.Substring(0, text.IndexOf('.')).Length > maxIntegerDigits)
           {
              return false;
           }
           if (text.Substring(text.IndexOf('.') + 1).Length > maxDecimalDigits)
           {
               return false;
           }
       }
       else if (text.Length > maxIntegerDigits)
       {
           return false;
       }

       return true;
   }


  • Il passo successivo, consiste nel controllare i tasti premuti dall'utente durante la digitazione.
  • Lo si fa scrivendo il codice seguente nell'evento txt1_KeyPress().

   private void txt1_KeyPress(object sender, KeyPressEventArgs e)
   {
       if (Char.IsDigit(e.KeyChar) || e.KeyChar == ',' || e.KeyChar == '.')
       {
           TextBox t = (TextBox)sender;
           if (!CheckDecimalNumber(t.Text, t.SelectionStart, t.SelectionLength, e.KeyChar, cifreIntere, cifreDecimali))
           {
               e.Handled = true;
           }
       }
       else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
       {
       }
       else
           e.Handled = true;
   }

  • Come si vede, si consente all'utente di digitare cifre, virgole e punti e questi caratteri vengono presi in carico dalla funzione CheckDecimalNumber().
  • L'utente può anche cancellare caratteri con il Backspace e con il Canc. In questo caso i caratteri non vengono 'filtrati'.
  • Gli altri caratteri non vengono accettati dall'evento.
  • I controlli non sono ancora finiti. Rimangono altri casi da gestire:
    • La cancellazione della virgola o del punto potrebbe rendere la parte intera troppo lunga.
    • Il copia e incolla anche di caratteri non numerici, funziona e sul TextBox potrebbero esserci dei caratteri non validi.
  • Gli ultimi controlli vanno inseriti nel codice che legge il TextBox per utilizzarne il valore, in questo esempio nell'evento Click() di un bottone: button1_Click().

   private void button1_Click(object sender, EventArgs e)
   {
       txt1.Text = txt1.Text.Replace(',', '.');
       // Verifiche parte 1.
       if (!CheckDecimalNumber(txt1.Text, cifreIntere, cifreDecimali))
       {
           MessageBox.Show("Valore non corretto!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
           txt1.Focus();
           return;
       }
       // Prova a convertire in decimal.
       decimal d = 0;
       if (!decimal.TryParse(txt1.Text, System.Globalization.NumberStyles.Any,
                             System.Globalization.CultureInfo.InvariantCulture, out d))
       {
           MessageBox.Show("Valore non corretto!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
           txt1.Focus();
           return;
       }
       // Sembra tutto a posto.
       MessageBox.Show("Valore OK! " + d.ToString(), "Messaggio", MessageBoxButtons.OK, MessageBoxIcon.Information);
   }

  • In questo codice viene fatta nuovamente la verifica sul numero di cifre intere e decimali e sulla presenza di un eventuale separatore.
  • Infine viene tentata la conversione con il TryParse().

© 2020 Carlo Vecchio
Torna ai contenuti