TextBox e Label: Interazione con l’Utente

Dalla raccolta dati alla visualizzazione: crea form interattivi professionali

🎯 Cosa Imparerai in Questa Lezione

Nella Lezione 1 hai creato un semplice bottone con MessageBox. Nella Lezione 2 hai imparato
variabili e operatori. Ora è il momento di far parlare l’utente con la tua app!
Imparerai a raccogliere input, validarli e mostrare risultati dinamici.

✨ Il Salto di Qualità

❌ Prima (Lezione 1):

MessageBox con testo fisso che dice sempre la stessa cosa

✅ Ora (Lezione 3):

Form che chiede il nome e risponde “Ciao Mario!” personalizzato

📚 Controlli che Padroneggerai
  • Label: Mostrare testo statico e dinamico (istruzioni, risultati)
  • TextBox: Raccogliere input dall’utente (nomi, numeri, email)
  • Button: Attivare azioni con eventi Click (già visto, ora approfondiamo)
  • Validazione: Controllare che l’utente inserisca dati corretti

📝 Teoria: Il Controllo Label

🤔 Cos’è una Label?

Una Label è come un’etichetta adesiva che metti sul form per mostrare del testo.
Può essere:

  • Statica: Testo che non cambia (es: “Inserisci il tuo nome:”)
  • Dinamica: Testo che cambia in base al programma (es: “Benvenuto Mario!”)
🎯 Quando Usare una Label

📌 Etichette

Dare nomi ai campi: “Nome:”, “Email:”, “Password:”

📊 Risultati

Mostrare output: “Totale: € 150,00”, “IMC: 22.5”

💬 Messaggi

Feedback all’utente: “Caricamento…”, “Salvato!”

🎨 Titoli

Intestazioni: “Benvenuto nella mia App”, “Risultati”

📋 Proprietà Principali della Label

Proprietà Cosa Fa Esempio
Name Nome per identificare la Label nel codice lblRisultato, lblTitolo
Text Il testo visualizzato (puoi cambiarlo nel codice!) "Benvenuto!", "" (vuoto)
Font Tipo, dimensione e stile del carattere Arial 12pt Bold, Times 16pt Italic
ForeColor Colore del testo Red, Blue, Green, Color.FromArgb(…)
BackColor Colore di sfondo della Label Yellow, Transparent, LightGray
TextAlign Allineamento del testo MiddleCenter, TopLeft, BottomRight
AutoSize Ridimensiona automaticamente per contenere il testo true (default), false (dimensione fissa)
Esempio: Cambiare il Testo di una Label nel Codice
// All'inizio la Label dice "Benvenuto!"
lblMessaggio.Text = "Benvenuto!";

// Dopo che l'utente inserisce il nome, cambia
string nome = txtNome.Text;
lblMessaggio.Text = "Ciao " + nome + "!";

// Oppure con interpolazione (più moderno)
lblMessaggio.Text = $"Ciao {nome}!";

✏️ Teoria: Il Controllo TextBox

🤔 Cos’è una TextBox?

Una TextBox è una “scatola di testo” dove l’utente può scrivere.
È il controllo fondamentale per raccogliere dati dall’utente.

🎯 Analogia: La TextBox è come un modulo cartaceo dove scrivi a mano.
Invece della penna, usi la tastiera!

🔑 Concetto FONDAMENTALE: La Proprietà .Text

La proprietà .Text è la più importante di tutti i controlli Windows Forms.
Puoi sia leggerla (vedere cosa c’è scritto) che scriverla
(modificare il contenuto).

// LEGGERE cosa ha scritto l'utente
string nome = txtNome.Text;  // Prende il testo dalla TextBox

// SCRIVERE nella TextBox (modificare il contenuto)
txtNome.Text = "Mario";      // Mette "Mario" nella TextBox

// SVUOTARE la TextBox
txtNome.Text = "";           // Stringa vuota = TextBox pulita
// Oppure
txtNome.Clear();             // Metodo dedicato per pulire

📋 Proprietà Principali della TextBox

Proprietà Cosa Fa Esempio/Note
Name Nome per identificare la TextBox nel codice txtNome, txtEmail, txtPassword
Text Il testo contenuto (SEMPRE una stringa!) Anche se scrivi “123”, è la stringa “123”
MaxLength Numero massimo di caratteri accettati 50 (limite ragionevole), 0 = nessun limite
Multiline Permette più righe di testo (con Invio) true = textarea, false = singola riga (default)
ScrollBars Barre scorrimento (solo se Multiline = true) Vertical, Horizontal, Both, None
PasswordChar Nasconde il testo (per password) ‘*’ o ‘●’ nasconde i caratteri
ReadOnly L’utente può solo leggere, non scrivere true = solo lettura, false = modificabile
PlaceholderText Testo di suggerimento (grigio chiaro) “Inserisci il tuo nome…”
Esempi Pratici di Configurazione TextBox
// TextBox per nome (massimo 50 caratteri)
txtNome.MaxLength = 50;
txtNome.PlaceholderText = "Es: Mario Rossi";

// TextBox per password (nasconde i caratteri)
txtPassword.PasswordChar = '●';
txtPassword.MaxLength = 20;

// TextBox per commenti (più righe con scroll)
txtCommenti.Multiline = true;
txtCommenti.ScrollBars = ScrollBars.Vertical;
txtCommenti.Size = new Size(300, 150);  // Più alta per vedere più righe

// TextBox di sola lettura (mostra risultato non modificabile)
txtRisultato.ReadOnly = true;
txtRisultato.BackColor = Color.LightGray;  // Visivamente distinta

⚠️ IMPORTANTE: Text è Sempre una Stringa!

Anche se l’utente scrive un numero come “123” nella TextBox, la proprietà .Text
restituisce la stringa “123”, non il numero 123!

// ❌ SBAGLIATO - Text è una stringa, non un numero!
int eta = txtEta.Text;  // ERRORE DI COMPILAZIONE!

// ✅ CORRETTO - Devi convertire la stringa in numero
string testoEta = txtEta.Text;  // "25" (stringa)
int eta = Convert.ToInt32(testoEta);  // 25 (numero intero)

// Oppure in una riga sola
int eta = Convert.ToInt32(txtEta.Text);

✅ Teoria: Validazione dell’Input

🤔 Perché la Validazione è FONDAMENTALE?

L’utente può scrivere qualsiasi cosa in una TextBox: numeri, lettere, simboli,
anche lasciare il campo vuoto! Se non controlli, il programma può crashare (andare in errore).

💥 Esempio di Crash:

// Utente scrive "ciao" invece di un numero
int eta = Convert.ToInt32(txtEta.Text);  // 💥 CRASH! FormatException!

Il programma va in errore perché “ciao” non è un numero!

🛡️ Tecniche di Validazione

1

Controllo Campo Vuoto

string.IsNullOrEmpty()
// Controlla se la TextBox è vuota
if (string.IsNullOrEmpty(txtNome.Text))
{
    MessageBox.Show("Per favore inserisci il tuo nome!", 
                    "Campo Obbligatorio",
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Warning);
    txtNome.Focus();  // Mette il cursore nella TextBox
    return;  // Esce dal metodo senza continuare
}

💡 string.IsNullOrEmpty() restituisce true se la stringa è vuota (“”) o null

2

Conversione Sicura con TryParse

int.TryParse() – NON va in errore!
// ✅ MODO SICURO - Se la conversione fallisce, non crasha
if (int.TryParse(txtEta.Text, out int eta))
{
    // Conversione riuscita! Usa la variabile "eta"
    MessageBox.Show($"Hai {eta} anni");
}
else
{
    // Conversione fallita (utente ha scritto testo)
    MessageBox.Show("Inserisci un numero valido per l'età!", 
                    "Errore",
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Error);
}

💡 TryParse restituisce true se riesce a convertire, false altrimenti

3

Validazione con Contains (per Email, ecc.)

Controllo Caratteri Specifici
// Controlla che l'email contenga @ e punto
string email = txtEmail.Text;

if (!email.Contains("@") || !email.Contains("."))
{
    MessageBox.Show("Inserisci un'email valida (deve contenere @ e .)", 
                    "Email Non Valida",
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Warning);
    return;
}

// Se arriviamo qui, l'email è (probabilmente) valida

4

Try-Catch: Gestione Errori Generica

Cattura Qualsiasi Errore
try
{
    // Codice che potrebbe andare in errore
    int numero = Convert.ToInt32(txtNumero.Text);
    int risultato = 100 / numero;  // Potrebbe dividere per 0!
    lblRisultato.Text = $"Risultato: {risultato}";
}
catch (FormatException)
{
    // Errore di formato (non è un numero)
    MessageBox.Show("Inserisci un numero valido!");
}
catch (DivideByZeroException)
{
    // Errore di divisione per zero
    MessageBox.Show("Non puoi dividere per zero!");
}
catch (Exception ex)
{
    // Qualsiasi altro errore
    MessageBox.Show($"Errore imprevisto: {ex.Message}");
}

💡 Try-Catch è più “pesante” di TryParse. Usa TryParse quando possibile!

👋 Progetto 1: Saluto Personalizzato

Crea un’applicazione che chiede il nome dell’utente e mostra un messaggio di benvenuto personalizzato.
Imparerai validazione, concatenazione stringhe e feedback visivo!

1

Interfaccia da Creare

Controllo Name Text/Proprietà
Label lblTitolo Text: “Benvenuto nella mia App!”, Font: 16pt Bold, ForeColor: DarkBlue
Label lblIstruzione Text: “Inserisci il tuo nome qui sotto:”
TextBox txtNome Text: (vuoto), MaxLength: 50
Button btnSaluta Text: “Salutami!”, BackColor: LightGreen
Label lblRisposta Text: (vuoto), Font: 12pt Italic, ForeColor: DarkGreen

2

Il Codice Completo con Commenti

Form1.cs
using System;
using System.Windows.Forms;

namespace SalutoPersonalizzato
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // ========================================
        // EVENTO CLICK del Button
        // ========================================
        private void btnSaluta_Click(object sender, EventArgs e)
        {
            // 1️⃣ Leggi il testo dalla TextBox
            string nomeUtente = txtNome.Text;
            
            // 2️⃣ VALIDAZIONE: Controlla se è vuoto
            if (string.IsNullOrEmpty(nomeUtente))
            {
                // Campo vuoto! Mostra errore
                MessageBox.Show("Per favore inserisci il tuo nome!", 
                              "Campo Vuoto", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Warning);
                
                // Metti il cursore nella TextBox per facilitare l'utente
                txtNome.Focus();
                
                // Esci dal metodo senza fare altro
                return;
            }
            
            // 3️⃣ Se arriviamo qui, il nome c'è! Crea il messaggio
            string messaggioBenvenuto = $"Ciao {nomeUtente}! Benvenuto nella mia applicazione!";
            
            // 4️⃣ Mostra il messaggio nella Label
            lblRisposta.Text = messaggioBenvenuto;
            
            // 5️⃣ Mostra anche un MessageBox
            MessageBox.Show(messaggioBenvenuto, 
                          "Benvenuto!", 
                          MessageBoxButtons.OK, 
                          MessageBoxIcon.Information);
        }
    }
}

3

🎨 Miglioramento: Evento KeyPress per Premere Invio

Permetti all’utente di premere Invio invece di cliccare il bottone:

Evento KeyPress della TextBox
// Evento che si attiva quando premi un tasto nella TextBox
private void txtNome_KeyPress(object sender, KeyPressEventArgs e)
{
    // Controlla se il tasto premuto è Invio
    if (e.KeyChar == (char)Keys.Enter)
    {
        // Simula il click del bottone
        btnSaluta_Click(sender, e);
        
        // Impedisce il "beep" del sistema
        e.Handled = true;
    }
}

💡 Come collegare l’evento:

  1. Seleziona txtNome nel Designer
  2. F4 → Icona fulmine ⚡ (Eventi)
  3. Trova KeyPress
  4. Doppio click per creare il metodo

🎂 Progetto 2: Calcolatore di Età

Crea un’app che calcola l’età in base all’anno di nascita. Imparerai conversione stringa→numero,
validazione numerica e calcoli con DateTime!

1

Interfaccia

  • Label: lblTitolo (testo: “Calcola la Tua Età”)
  • Label: lblAnno (testo: “Anno di nascita:”)
  • TextBox: txtAnnoNascita
  • Button: btnCalcola (testo: “Calcola Età”)
  • Label: lblRisultato (vuoto, font grande)

2

Codice con Validazione Completa

CalcolatoreEta.cs
private void btnCalcola_Click(object sender, EventArgs e)
{
    // 1️⃣ Leggi l'input
    string testoAnno = txtAnnoNascita.Text;
    
    // 2️⃣ Controllo campo vuoto
    if (string.IsNullOrEmpty(testoAnno))
    {
        MessageBox.Show("Inserisci l'anno di nascita!", 
                      "Attenzione", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Warning);
        txtAnnoNascita.Focus();
        return;
    }
    
    // 3️⃣ Conversione SICURA con TryParse
    if (!int.TryParse(testoAnno, out int annoNascita))
    {
        MessageBox.Show("Inserisci un numero valido!", 
                      "Errore", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
        txtAnnoNascita.Focus();
        return;
    }
    
    // 4️⃣ Validazione range (anno sensato)
    int annoCorrente = DateTime.Now.Year;
    
    if (annoNascita > annoCorrente)
    {
        MessageBox.Show("Non puoi essere nato nel futuro!", 
                      "Errore", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
        return;
    }
    
    if (annoNascita < (annoCorrente - 120))
    {
        MessageBox.Show("Età non realistica (oltre 120 anni)!", 
                      "Errore", 
                      MessageBoxButtons.OK, 
                      MessageBoxIcon.Error);
        return;
    }
    
    // 5️⃣ Calcola l'età
    int età = annoCorrente - annoNascita;
    
    // 6️⃣ Mostra risultato con messaggio personalizzato
    lblRisultato.Text = $"Hai {età} anni!";
    
    string messaggio;
    if (età < 18)
    {
        messaggio = $"Hai {età} anni. Sei minorenne!";
        lblRisultato.ForeColor = Color.Orange;
    }
    else if (età < 65)
    {
        messaggio = $"Hai {età} anni. Sei nel fiore degli anni!";
        lblRisultato.ForeColor = Color.Green;
    }
    else
    {
        messaggio = $"Hai {età} anni. Saggezza e esperienza!";
        lblRisultato.ForeColor = Color.Blue;
    }
    
    MessageBox.Show(messaggio, 
                  "La Tua Età", 
                  MessageBoxButtons.OK, 
                  MessageBoxIcon.Information);
}

📏 Progetto 3: Contatore Caratteri in Tempo Reale

Crea un'app come Twitter che conta i caratteri mentre scrivi! Imparerai l'evento TextChanged
e la proprietà .Length delle stringhe.

1

Interfaccia

  • Label: lblTitolo (testo: "Scrivi il tuo messaggio:")
  • TextBox: txtMessaggio (Multiline: true, Size: 350x150)
  • Label: lblContatore (testo: "Caratteri: 0", font grande, bold)

2

Codice con Feedback Visivo

ContatoreCaratteri.cs
// ========================================
// EVENTO TextChanged - Si attiva OGNI volta che scrivi
// ========================================
private void txtMessaggio_TextChanged(object sender, EventArgs e)
{
    // 1️⃣ Leggi il testo corrente
    string testo = txtMessaggio.Text;
    
    // 2️⃣ Conta i caratteri
    int numeroCaratteri = testo.Length;
    
    // 3️⃣ Aggiorna il contatore
    lblContatore.Text = $"Caratteri: {numeroCaratteri}";
    
    // 4️⃣ Cambia colore in base al numero di caratteri
    if (numeroCaratteri == 0)
    {
        lblContatore.ForeColor = Color.Gray;
    }
    else if (numeroCaratteri < 100)
    {
        lblContatore.ForeColor = Color.Green;
    }
    else if (numeroCaratteri < 200)
    {
        lblContatore.ForeColor = Color.Orange;
    }
    else if (numeroCaratteri < 280)
    {
        lblContatore.ForeColor = Color.Red;
    }
    else
    {
        // Oltre 280 (limite Twitter)
        lblContatore.ForeColor = Color.DarkRed;
        lblContatore.Text = $"Caratteri: {numeroCaratteri} - LIMITE SUPERATO!";
    }
}

💡 Come Collegare l'Evento TextChanged
  1. Seleziona txtMessaggio nel Designer
  2. F4 → Icona fulmine ⚡
  3. Trova TextChanged
  4. Doppio click per creare il metodo

🎓 Riepilogo: Cosa Hai Imparato

✅ Competenze Acquisite

📝 Label

  • Mostrare testo statico e dinamico
  • Cambiare Text, ForeColor nel codice
  • Usare per istruzioni e risultati
✏️ TextBox

  • Raccogliere input dall'utente
  • Leggere/scrivere proprietà .Text
  • MaxLength, Multiline, PasswordChar
✅ Validazione

  • string.IsNullOrEmpty()
  • int.TryParse(), double.TryParse()
  • Try-Catch per errori
⚡ Eventi

  • Click per azioni immediate
  • TextChanged per aggiornamenti real-time
  • KeyPress per intercettare Invio

🚀 Prossimi Passi

📖 Nella Lezione 4 Imparerai:

  • 📋 ListBox e ComboBox: Lavorare con liste di elementi
  • Aggiungere/Rimuovere Items: Gestire dinamicamente le liste
  • 🔍 SelectedItem e SelectedIndex: Capire quale elemento è selezionato
  • 💼 Progetto Completo: Gestionale Inventario con categorie e filtri

🎯 Con ListBox e ComboBox potrai gestire ELENCHI di dati, non solo singoli valori!

💪 Esercizi Prima della Prossima Lezione
  1. Calcolatore IMC: 2 TextBox (peso, altezza), calcola IMC, mostra categoria
  2. Convertitore Temperatura: TextBox Celsius, Button converti, Label Fahrenheit
  3. Generatore Username: TextBox nome+cognome, genera username, mostra in Label
  4. Password Validator: TextBox password, verifica lunghezza min 8 caratteri

Lezione 3 - TextBox e Label per l'Input Utente

Corso C# Completo con Interfaccia Grafica - Da Zero a Esperto

Torna in alto