Crea interfacce professionali con RadioButton, CheckBox, Menu e Immagini.
Cosa Imparerai in Questa Lezione
Congratulazioni per essere arrivato fin qui! Hai giΓ imparato a gestire TextBox, ListBox, ComboBox e gli eventi multipli. Ora Γ¨ il momento di scoprire controlli ancora piΓΉ potenti che renderanno le tue applicazioni davvero professionali! π
β¨ I Nuovi Controlli che Padroneggerai
π RadioButton
Scelta esclusiva: puoi selezionare SOLO UNA opzione alla volta (es: Maschio/Femmina, Piccola/Media/Grande)
βοΈ CheckBox
Scelta multipla: puoi selezionare QUANTE vuoi (es: RGB, SSD, WiFi, Bluetooth - tutte insieme!)
π MenuStrip
Menu professionale in alto come Word/Excel (File β Nuovo, Modifica β Copia, ecc.)
πΌοΈ PictureBox
Mostra immagini nella tua app: loghi, foto prodotti, icone, qualsiasi immagine!
π Prerequisiti
Prima di iniziare, dovresti aver completato:
- β TextBox e Label
- β ListBox e ComboBox
- β Gestione Eventi Multipli
Se hai fatto questi, sei pronto per creare app ancora piΓΉ fighe!
RadioButton vs CheckBox: Qual Γ¨ la Differenza?
RadioButton
UNA SOLA SCELTA
β Piccola
β― Media
β― Grande
π‘ Quando usarlo:
- Taglia vestiti
- Maschio/Femmina
- Scelta processore (i5/i7/i9)
- Livello difficoltΓ
β‘ Regola: Se selezioni "Media", "Piccola" e "Grande" si deselezioneranno automaticamente
CheckBox
PIΓ SCELTE INSIEME
β Luci RGB
β SSD NVMe
β WiFi 6
β Bluetooth
π‘ Quando usarlo:
- Opzioni PC (RGB, SSD, WiFi)
- Giorni allenamento
- Servizi extra viaggio
- Ingredienti pizza
β‘ Regola: Puoi selezionare TUTTE le opzioni che vuoi, sono indipendenti!
π― Trucco per Ricordare:
RadioButton = Canali radio (ne ascolti UNO alla volta) CheckBox = Carrello spesa (metti TUTTO quello che vuoi)
Esercizio 1: Configuratore PC Gaming
Obiettivo
Crea un'applicazione dove l'utente puΓ² configurare il proprio PC Gaming scegliendo processore, scheda video e opzioni extra. L'app calcola automaticamente il prezzo totale!
π― Cosa Imparerai:
- Usare RadioButton per scelta esclusiva (un solo processore)
- Usare CheckBox per opzioni multiple (RGB + SSD + altro)
- Creare un Menu professionale in alto
- Mostrare immagini di prodotti
- Calcolare prezzi e formattarli come β¬ 1.250,00
- Crea l'Interfaccia Passo-Passo
π§ Controlli da Aggiungere:
1οΈβ£ GroupBox "Processore" con RadioButton:
rdb_i5(testo: "Intel i5 - β¬250")rdb_i7(testo: "Intel i7 - β¬400")rdb_i9(testo: "Intel i9 - β¬600")rdb_ryzen7(testo: "AMD Ryzen 7 - β¬350")π‘ Il GroupBox raggruppa i RadioButton, cosΓ¬ puoi selezionarne uno solo
2οΈβ£ GroupBox "Scheda Video" con RadioButton:
rdb_rtx3060(testo: "RTX 3060 - β¬350")rdb_rtx4070(testo: "RTX 4070 - β¬650")rdb_rtx4090(testo: "RTX 4090 - β¬1200")
3οΈβ£ GroupBox "Opzioni Extra" con CheckBox:
chk_rgb(testo: "Luci RGB - β¬80")chk_watercooling(testo: "Raffreddamento a Liquido - β¬120")chk_ssd_nvme(testo: "SSD NVMe 1TB - β¬150")π‘ Qui puoi selezionare TUTTE le opzioni che vuoi!
4οΈβ£ Altri Controlli:
- Button:
btn_calcola_prezzo(testo: "Calcola Prezzo")- Label:
lbl_prezzo_totale(testo: "β¬ 0,00", font grande, bold)- PictureBox:
pic_pc_gaming(per immagine PC)
5οΈβ£ MenuStrip (in alto):
- File β
Nuova Configurazione- File β
Esciπ‘ Come creare il menu: Trascina "MenuStrip" dalla Toolbox, poi clicca su "File" e aggiungi le voci
- Il Codice Completo Spiegato
ConfiguratorePCGaming.cs
using System;
using System.Windows.Forms;
namespace ConfiguratorePCGaming
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Seleziona opzioni di default all'avvio
rdb_i5.Checked = true;
rdb_rtx3060.Checked = true;
}
// ========================================
// METODO: Calcola il prezzo totale
// ========================================
private void btn_calcola_prezzo_Click(object sender, EventArgs e)
{
// Usa decimal per i prezzi (piΓΉ preciso di double)
decimal prezzo_totale = 0;
try
{
// βββββββββββββββββββββββββββββββββ
// 1οΈβ£ CALCOLA PREZZO PROCESSORE
// βββββββββββββββββββββββββββββββββ
// Solo UNO sarΓ selezionato (RadioButton)
if (rdb_i5.Checked)
prezzo_totale += 250;
else if (rdb_i7.Checked)
prezzo_totale += 400;
else if (rdb_i9.Checked)
prezzo_totale += 600;
else if (rdb_ryzen7.Checked)
prezzo_totale += 350;
// βββββββββββββββββββββββββββββββββ
// 2οΈβ£ CALCOLA PREZZO SCHEDA VIDEO
// βββββββββββββββββββββββββββββββββ
// Anche qui solo UNA scheda video
if (rdb_rtx3060.Checked)
prezzo_totale += 350;
else if (rdb_rtx4070.Checked)
prezzo_totale += 650;
else if (rdb_rtx4090.Checked)
prezzo_totale += 1200;
// βββββββββββββββββββββββββββββββββ
// 3οΈβ£ CALCOLA OPZIONI EXTRA
// βββββββββββββββββββββββββββββββββ
// Qui possono essere selezionate TUTTE (CheckBox)
if (chk_rgb.Checked)
prezzo_totale += 80;
if (chk_watercooling.Checked)
prezzo_totale += 120;
if (chk_ssd_nvme.Checked)
prezzo_totale += 150;
// βββββββββββββββββββββββββββββββββ
// 4οΈβ£ MOSTRA IL RISULTATO FORMATTATO
// βββββββββββββββββββββββββββββββββ
// ToString("C") formatta come valuta: β¬ 1.250,00
lbl_prezzo_totale.Text = prezzo_totale.ToString("C");
lbl_prezzo_totale.ForeColor = Color.Green;
}
catch (Exception ex)
{
// Se qualcosa va storto, mostra l'errore
MessageBox.Show("Errore nel calcolo: " + ex.Message,
"Errore",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
// ========================================
// MENU: Nuova Configurazione
// ========================================
private void nuovaConfigurazioneToolStripMenuItem_Click(object sender, EventArgs e)
{
// Resetta tutto allo stato iniziale
rdb_i5.Checked = true;
rdb_rtx3060.Checked = true;
chk_rgb.Checked = false;
chk_watercooling.Checked = false;
chk_ssd_nvme.Checked = false;
lbl_prezzo_totale.Text = "β¬ 0,00";
lbl_prezzo_totale.ForeColor = Color.Black;
MessageBox.Show("Configurazione resettata!",
"Info",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
// ========================================
// MENU: Esci dall'applicazione
// ========================================
private void esciToolStripMenuItem_Click(object sender, EventArgs e)
{
// Chiedi conferma prima di chiudere
DialogResult risultato = MessageBox.Show(
"Sei sicuro di voler uscire?",
"Conferma Uscita",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (risultato == DialogResult.Yes)
{
Application.Exit(); // Chiudi l'applicazione
}
}
}
}
- π¬ Come Funziona? (Esempio Pratico)
π Scenario: Configurazione PC Gaming
1οΈβ£ L'utente seleziona:
- β Intel i7 (β¬400)
- β RTX 4070 (β¬650)
- β Luci RGB (β¬80)
- β SSD NVMe (β¬150)
2οΈβ£ Clicca "Calcola Prezzo"
Il codice calcola:
400 + 650 + 80 + 150 = β¬1.280,00
3οΈβ£ Risultato mostrato:
β¬ 1.280,00
π‘ Nota: Se cambi processore da i7 a i9, devi cliccare di nuovo "Calcola Prezzo" per vedere il nuovo totale.
- π¨ Miglioria: Calcolo Automatico in Tempo Reale
Vuoi che il prezzo si aggiorni automaticamente senza cliccare il pulsante? Ecco come:
Versione con Aggiornamento Automatico
// Metodo che calcola e aggiorna automaticamente
private void AggiornaPrezzoAutomatico()
{
decimal prezzo_totale = 0;
// Processore
if (rdb_i5.Checked) prezzo_totale += 250;
else if (rdb_i7.Checked) prezzo_totale += 400;
else if (rdb_i9.Checked) prezzo_totale += 600;
else if (rdb_ryzen7.Checked) prezzo_totale += 350;
// Scheda Video
if (rdb_rtx3060.Checked) prezzo_totale += 350;
else if (rdb_rtx4070.Checked) prezzo_totale += 650;
else if (rdb_rtx4090.Checked) prezzo_totale += 1200;
// Opzioni
if (chk_rgb.Checked) prezzo_totale += 80;
if (chk_watercooling.Checked) prezzo_totale += 120;
if (chk_ssd_nvme.Checked) prezzo_totale += 150;
lbl_prezzo_totale.Text = prezzo_totale.ToString("C");
}
// Collegare questo metodo a TUTTI i RadioButton e CheckBox!
// Evento CheckedChanged per ogni controllo:
private void ControlloQualsiasi_CheckedChanged(object sender, EventArgs e)
{
AggiornaPrezzoAutomatico();
}
// Nel Designer: Collega CheckedChanged di TUTTI i controlli a questo metodo!
β¨ Risultato: Ora il prezzo si aggiorna in tempo reale appena cambi un'opzione, senza dover cliccare alcun pulsante!
Concetti Chiave dell'Esercizio 1
decimal (tipo per soldi)
Tipo di dato speciale per calcoli monetari. PiΓΉ preciso di double
perchΓ© non ha errori di arrotondamento.
// Usa decimal per i soldi
decimal prezzo = 250.50m; // La "m" alla fine = decimal
// SBAGLIATO con double:
double prezzo1 = 0.1 + 0.2; // = 0.30000000000000004 π±
// GIUSTO con decimal:
decimal prezzo2 = 0.1m + 0.2m; // = 0.3 β
.ToString("C") - Formato Valuta
Converte un numero in formato valuta con simbolo β¬ e decimali
decimal numero = 1250.50m;
numero.ToString() // "1250.5"
numero.ToString("C") // "β¬ 1.250,50" (in Italia)
numero.ToString("C0") // "β¬ 1.251" (senza decimali)
numero.ToString("F2") // "1250.50" (senza β¬)
DialogResult (conferme)
Usato per sapere quale pulsante l'utente ha cliccato in un MessageBox
DialogResult risultato = MessageBox.Show(
"Sei sicuro?",
"Conferma",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (risultato == DialogResult.Yes)
{
// L'utente ha cliccato SΓ
}
else
{
// L'utente ha cliccato NO
}
Application.Exit()
Chiude completamente l'applicazione Windows Forms
Application.Exit(); // Chiude tutto
Esercizio 2: Generatore Piano di Allenamento
Obiettivo
Crea un'app che genera un piano di allenamento personalizzato in base a: livello (principiante/intermedio/avanzato), obiettivo (forza/dimagrimento/resistenza) e giorni della settimana selezionati!
π― NovitΓ in Questo Esercizio:
- Usare StringBuilder per costruire testo lungo
- Generare contenuto dinamico in base alle scelte
- Mostrare risultati in una TextBox multiriga
- Validare che l'utente abbia fatto tutte le selezioni necessarie
- Interfaccia da Creare
- GroupBox "Livello" con RadioButton:
rdb_principianterdb_intermediordb_avanzato
- GroupBox "Obiettivo" con RadioButton:
rdb_forzardb_dimagrimentordb_resistenza
- GroupBox "Giorni Allenamento" con CheckBox:
chk_lunedi,chk_martedi,chk_mercoledi, ecc.
- Button:
btn_genera_allenamento - TextBox:
txt_piano(Multiline = true, ScrollBars = Vertical)
- Codice Semplificato con Spiegazioni
GeneratorePianoAllenamento.cs
using System;
using System.Text; // Per usare StringBuilder
using System.Windows.Forms;
namespace PianoAllenamento
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// ========================================
// GENERA IL PIANO DI ALLENAMENTO
// ========================================
private void btn_genera_allenamento_Click(object sender, EventArgs e)
{
// 1οΈβ£ Controlla che l'utente abbia selezionato livello e obiettivo
if (!VerificaSelezioni())
{
MessageBox.Show("β οΈ Seleziona livello e obiettivo!",
"Attenzione",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
return; // Esci dal metodo
}
// 2οΈβ£ Crea il piano usando StringBuilder
StringBuilder piano = new StringBuilder();
// Intestazione
piano.AppendLine("ββββββββββββββββββββββββββββββββββββββββ");
piano.AppendLine(" π PIANO ALLENAMENTO PERSONALIZZATO");
piano.AppendLine("ββββββββββββββββββββββββββββββββββββββββ");
piano.AppendLine();
piano.AppendLine($"π€ Livello: {OttieniLivello()}");
piano.AppendLine($"π― Obiettivo: {OttieniObiettivo()}");
piano.AppendLine();
piano.AppendLine("ββββββββββββββββββββββββββββββββββββββββ");
piano.AppendLine();
// 3οΈβ£ Genera i giorni selezionati
GeneraGiorniAllenamento(piano);
// 4οΈβ£ Mostra il risultato nella TextBox
txt_piano.Text = piano.ToString();
}
// ========================================
// VERIFICA CHE LIVELLO E OBIETTIVO SIANO SELEZIONATI
// ========================================
private bool VerificaSelezioni()
{
// Verifica almeno un livello
bool livelloOk = rdb_principiante.Checked ||
rdb_intermedio.Checked ||
rdb_avanzato.Checked;
// Verifica almeno un obiettivo
bool obiettivoOk = rdb_forza.Checked ||
rdb_dimagrimento.Checked ||
rdb_resistenza.Checked;
return livelloOk && obiettivoOk;
}
// ========================================
// OTTIENI IL LIVELLO SELEZIONATO
// ========================================
private string OttieniLivello()
{
if (rdb_principiante.Checked) return "Principiante";
if (rdb_intermedio.Checked) return "Intermedio";
if (rdb_avanzato.Checked) return "Avanzato";
return "Non specificato";
}
// ========================================
// OTTIENI L'OBIETTIVO SELEZIONATO
// ========================================
private string OttieniObiettivo()
{
if (rdb_forza.Checked) return "Forza Muscolare";
if (rdb_dimagrimento.Checked) return "Dimagrimento";
if (rdb_resistenza.Checked) return "Resistenza";
return "Non specificato";
}
// ========================================
// GENERA GLI ESERCIZI PER I GIORNI SELEZIONATI
// ========================================
private void GeneraGiorniAllenamento(StringBuilder piano)
{
// Array con esercizi
string[] esercizi = {
"Squat",
"Panca piana",
"Stacchi da terra",
"Military Press",
"Rematore con bilanciere"
};
// Calcola ripetizioni in base al livello
int ripetizioni = OttieniRipetizioni();
// βββββββββββββββββββββββββββ
// LUNEDΓ
// βββββββββββββββββββββββββββ
if (chk_lunedi.Checked)
{
piano.AppendLine("π
LUNEDΓ - Gambe e Petto");
piano.AppendLine($" β’ {esercizi[0]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine($" β’ {esercizi[1]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine();
}
// βββββββββββββββββββββββββββ
// MERCOLEDΓ
// βββββββββββββββββββββββββββ
if (chk_mercoledi.Checked)
{
piano.AppendLine("π
MERCOLEDΓ - Schiena e Spalle");
piano.AppendLine($" β’ {esercizi[2]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine($" β’ {esercizi[3]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine();
}
// βββββββββββββββββββββββββββ
// VENERDΓ
// βββββββββββββββββββββββββββ
if (chk_venerdi.Checked)
{
piano.AppendLine("π
VENERDΓ - Full Body");
piano.AppendLine($" β’ {esercizi[0]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine($" β’ {esercizi[4]} - 3 serie x {ripetizioni} ripetizioni");
piano.AppendLine();
}
// Aggiungi altri giorni se vuoi...
piano.AppendLine("ββββββββββββββββββββββββββββββββββββββββ");
piano.AppendLine("πͺ Buon allenamento!");
}
// ========================================
// CALCOLA RIPETIZIONI IN BASE AL LIVELLO
// ========================================
private int OttieniRipetizioni()
{
if (rdb_principiante.Checked) return 8;
if (rdb_intermedio.Checked) return 10;
if (rdb_avanzato.Checked) return 12;
return 8; // Default
}
}
}
- π¬ Esempio di Output Generato
Esempio Risultato
ββββββββββββββββββββββββββββββββββββββββ
π PIANO ALLENAMENTO PERSONALIZZATO
ββββββββββββββββββββββββββββββββββββββββ
π€ Livello: Intermedio
π― Obiettivo: Forza Muscolare
ββββββββββββββββββββββββββββββββββββββββ
π
LUNEDΓ - Gambe e Petto
β’ Squat - 3 serie x 10 ripetizioni
β’ Panca piana - 3 serie x 10 ripetizioni
π
MERCOLEDΓ - Schiena e Spalle
β’ Stacchi da terra - 3 serie x 10 ripetizioni
β’ Military Press - 3 serie x 10 ripetizioni
π
VENERDΓ - Full Body
β’ Squat - 3 serie x 10 ripetizioni
β’ Rematore con bilanciere - 3 serie x 10 ripetizioni
ββββββββββββββββββββββββββββββββββββββββ
πͺ Buon allenamento!
Concetti Chiave dell'Esercizio 2
StringBuilder
Classe per costruire stringhe lunghe in modo efficiente. Molto meglio di concatenare con +
// β LENTO (crea 3 nuove stringhe!)
string testo = "";
testo += "Riga 1\n";
testo += "Riga 2\n";
testo += "Riga 3\n";
// β
VELOCE (StringBuilder)
StringBuilder sb = new StringBuilder();
sb.AppendLine("Riga 1");
sb.AppendLine("Riga 2");
sb.AppendLine("Riga 3");
string risultato = sb.ToString();
.AppendLine()
Aggiunge una riga di testo al StringBuilder con "a capo" automatico
StringBuilder sb = new StringBuilder();
sb.AppendLine("Linea 1"); // Aggiunge "Linea 1\n"
sb.AppendLine("Linea 2"); // Aggiunge "Linea 2\n"
sb.AppendLine(); // Aggiunge solo "\n" (riga vuota)
TextBox Multilinea
Configurare una TextBox per mostrare piΓΉ righe di testo
// Nel Designer:
// 1. Seleziona la TextBox
// 2. ProprietΓ β Multiline = true
// 3. ProprietΓ β ScrollBars = Vertical
// 4. Ridimensiona in altezza
// Nel codice:
txt_piano.Multiline = true;
txt_piano.ScrollBars = ScrollBars.Vertical;
txt_piano.Text = "Riga 1\nRiga 2\nRiga 3";
Riepilogo: Cosa Hai Imparato
β¨ Nuove Competenze Acquisite
1οΈβ£ RadioButton vs CheckBox
Hai capito la differenza tra scelta esclusiva (RadioButton) e scelta multipla (CheckBox), e quando usare l'uno o l'altro.
2οΈβ£ GroupBox per Organizzare
Hai imparato a raggruppare controlli correlati usando GroupBox, rendendo l'interfaccia piΓΉ pulita e professionale.
3οΈβ£ MenuStrip Professionale
Hai creato menu come nelle app professionali (File β Nuovo, Esci) con gestione delle voci menu.
4οΈβ£ Calcoli con Decimal
Hai usato il tipo decimal per calcoli monetari precisi e formattato i prezzi come β¬ 1.250,00.
5οΈβ£ StringBuilder
Hai scoperto come costruire testi lunghi in modo efficiente usando StringBuilder invece di concatenare stringhe.
6οΈβ£ Validazione Robusta
Hai implementato controlli per verificare che l'utente abbia completato tutte le selezioni necessarie.
Best Practices (Buone Abitudini)
Da Fare
- Raggruppa con GroupBox: Metti RadioButton correlati nello stesso GroupBox
- Valida sempre: Controlla che l'utente abbia selezionato tutto il necessario
- Usa decimal per soldi: Mai usare double o float per prezzi
- StringBuilder per testi lunghi: Molto piΓΉ efficiente di +=
- Nomi descrittivi:
rdb_i5,chk_rgbsono chiari
Da Evitare
- RadioButton senza GroupBox: Non funzionano bene insieme
- Nessuna validazione: L'app potrebbe crashare
- double per prezzi: Crea errori di arrotondamento
- + per testi lunghi: Lentissimo con molte righe
- Nomi generici:
radioButton1non dice nulla
Tabella Riferimento Rapido
| Controllo | Quando Usarlo | ProprietΓ Importante | Esempio |
|---|---|---|---|
| RadioButton | Scelta ESCLUSIVA (una sola) | .Checked |
Taglia vestito, Livello difficoltΓ |
| CheckBox | Scelte MULTIPLE (anche tutte) | .Checked |
Opzioni extra, Giorni settimana |
| GroupBox | Raggruppare controlli correlati | .Text (titolo) |
Raggruppa RadioButton processore |
| MenuStrip | Menu applicazione professionale | Voci del menu | File β Nuovo, Esci |
| PictureBox | Mostrare immagini | .Image |
Loghi, foto prodotti, icone |
| StringBuilder | Costruire testi lunghi | .AppendLine() |
Report, piani, elenchi |
Esercizi per Allenarsi
Sfide Progressive
β Livello Facile:
- Crea un configuratore Pizza: scegli dimensione (Piccola/Media/Grande) e ingredienti extra (Mozzarella, Salame, Funghi, ecc.)
- Calcola il prezzo totale e mostralo formattato
ββ Livello Medio:
- Crea un configuratore Auto: marca (Fiat/Ford/BMW), optional (Navigatore/Sensori/Tetto), calcola preventivo
- Aggiungi immagini diverse per ogni marca di auto
- Genera un report dettagliato con StringBuilder
βββ Livello Difficile:
- Crea un generatore di Curriculum Vitae completo
- L'utente sceglie template (Classico/Moderno/Creativo), sezioni da includere (Esperienze/Lingue/Hobby)
- Genera un CV formattato con StringBuilder e possibilitΓ di salvarlo in file txt
- Aggiungi menu per salvare, caricare configurazione precedente
π Prossimi Passi
Hai completato gli esercizi avanzati su Windows Forms! Ora hai tutte le competenze per creare applicazioni grafiche professionali. Il prossimo step? Approfondire i fondamenti teorici della programmazione (variabili, operatori, cicli) per capire ancora meglio come funziona tutto! π


