📋 Controlli di Lista: ListBox e ComboBox

Impara a gestire liste, scelte e menu a tendina in Windows Forms

Cosa sono ListBox e ComboBox

ListBox: È una scatola che mostra una lista di elementi. Puoi sceglierne uno o più.
ComboBox: È come un menu a tendina – clicchi la freccia e scegli un’opzione dalla lista.

🎯 Concetti Base

ListBox

Mostra tutti gli elementi, puoi sceglierne più di uno

ComboBox

Occupa poco spazio, mostra solo l’elemento selezionato

Items

La lista degli elementi dentro questi controlli

SelectedItem

L’elemento che hai scelto

📚 Spiegazione degli Array (Liste Fisse)

Un array è come una scatola con tanti scomparti fissi

// Crea array con 3 scomparti vuoti
string[] frutti = new string[3]; 

// Riempi gli scomparti
frutti[0] = "Mela";    // primo scomparto
frutti[1] = "Banana";  // secondo scomparto  
frutti[2] = "Arancia"; // terzo scomparto

// Oppure crealo già pieno
string[] colori = { "Rosso", "Verde", "Blu" };

📚 Spiegazione delle List (Liste che Crescono)

Una List è come uno scaffale elastico che cresce

// Crea lista vuota
List<string> nomi = new List<string>();

// Aggiungi elementi
nomi.Add("Mario");    // aggiungi un elemento
nomi.Add("Luigi");    // aggiungi un altro

// Rimuovi elementi
nomi.Remove("Mario"); // togli un elemento

// La List cresce automaticamente!

🛒 Esercizio 1: Lista della Spesa Semplice

▶ Obiettivo

Creare una lista dove aggiungere prodotti da comprare. Imparerai i concetti base di ListBox,
TextBox e Button in un’applicazione pratica e utile.

1

Interfaccia Semplice

Tipo Controllo Name Funzione
TextBox txtProdotto Per scrivere il prodotto
Button btnAggiungi Per aggiungere alla lista
ListBox lstSpesa Per vedere tutti i prodotti
Button btnRimuovi Per togliere il prodotto selezionato

2

Codice Spiegato Passo Passo

FormSpesa.cs – Gestione Lista della Spesa
using System;
using System.Windows.Forms;

namespace ListaSpesa
{
    public partial class FormSpesa : Form
    {
        public FormSpesa()
        {
            InitializeComponent();
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Click del pulsante "Aggiungi"
        // ═══════════════════════════════════════════════════════
        private void btnAggiungi_Click(object sender, EventArgs e)
        {
            // ─────────────────────────────────────────────────
            // STEP 1: Controlla se la TextBox è vuota
            // ─────────────────────────────────────────────────
            if (txtProdotto.Text == "")
            {
                MessageBox.Show("Scrivi un prodotto!");
                return; // Ferma il metodo qui
            }
            
            // ─────────────────────────────────────────────────
            // STEP 2: Aggiunge il testo alla ListBox
            // ─────────────────────────────────────────────────
            lstSpesa.Items.Add(txtProdotto.Text);
            
            // ─────────────────────────────────────────────────
            // STEP 3: Svuota la TextBox dopo aver aggiunto
            // ─────────────────────────────────────────────────
            txtProdotto.Text = "";
            
            // ─────────────────────────────────────────────────
            // STEP 4: Mette il cursore nella TextBox
            // ─────────────────────────────────────────────────
            txtProdotto.Focus();
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Click del pulsante "Rimuovi"
        // ═══════════════════════════════════════════════════════
        private void btnRimuovi_Click(object sender, EventArgs e)
        {
            // ─────────────────────────────────────────────────
            // STEP 1: Controlla se è stato selezionato qualcosa
            // ─────────────────────────────────────────────────
            if (lstSpesa.SelectedIndex == -1)
            {
                MessageBox.Show("Seleziona un prodotto da rimuovere!");
                return;
            }
            
            // ─────────────────────────────────────────────────
            // STEP 2: Rimuove l'elemento selezionato
            // ─────────────────────────────────────────────────
            lstSpesa.Items.RemoveAt(lstSpesa.SelectedIndex);
        }
    }
}

📚 Metodi Usati – Spiegazione

Items.Add()
Aggiunge un elemento alla ListBox o ComboBox.

// Sintassi:
controllo.Items.Add(elemento);

// Esempi:
lstSpesa.Items.Add("Mele");
lstSpesa.Items.Add("Pane");
lstSpesa.Items.Add("Latte");

// In pratica:
string prodotto = txtProdotto.Text;
lstSpesa.Items.Add(prodotto);

SelectedIndex
Indica quale elemento è selezionato. Il valore -1 significa “nessuno selezionato”.

// Sintassi:
int posizione = controllo.SelectedIndex;

// Valori possibili:
// -1 → Nessun elemento selezionato
//  0 → Primo elemento selezionato
//  1 → Secondo elemento selezionato
//  n → Elemento in posizione n selezionato

// Uso pratico:
if (lstSpesa.SelectedIndex == -1)
{
    // Nessun elemento selezionato
    MessageBox.Show("Seleziona un elemento!");
}

Items.RemoveAt()
Rimuove l’elemento alla posizione specificata.

// Sintassi:
controllo.Items.RemoveAt(indice);

// Esempi:
lstSpesa.Items.RemoveAt(0);   // Rimuove il primo elemento
lstSpesa.Items.RemoveAt(2);   // Rimuove il terzo elemento

// Uso con SelectedIndex:
int posizione = lstSpesa.SelectedIndex;
if (posizione != -1)
{
    lstSpesa.Items.RemoveAt(posizione);
}

🎨 Esercizio 2: Scelta Colori con ComboBox

▶ Obiettivo

Scegliere un colore da un menu a tendina e cambiare il colore di sfondo del form.
Introduce l’uso della ComboBox e l’istruzione switch per gestire scelte multiple.

1

Interfaccia

Tipo Controllo Name Funzione
ComboBox cmbColori Per scegliere il colore
Button btnCambia Per applicare il colore

Nota: Il form cambia colore di sfondo in base alla selezione

2

Codice Completo

FormColori.cs – Gestione Colori
using System;
using System.Drawing;
using System.Windows.Forms;

namespace SceltaColori
{
    public partial class FormColori : Form
    {
        public FormColori()
        {
            InitializeComponent();
            InizializzaColori(); // Chiama il metodo all'avvio
        }

        // ═══════════════════════════════════════════════════════
        // METODO: Inizializza la ComboBox con i colori
        // ═══════════════════════════════════════════════════════
        private void InizializzaColori()
        {
            // Aggiunge diversi colori alla ComboBox
            cmbColori.Items.Add("Rosso");
            cmbColori.Items.Add("Verde");
            cmbColori.Items.Add("Blu");
            cmbColori.Items.Add("Giallo");
            cmbColori.Items.Add("Arancia");
            
            // Seleziona il primo elemento della lista
            cmbColori.SelectedIndex = 0;
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Click del pulsante "Cambia Colore"
        // ═══════════════════════════════════════════════════════
        private void btnCambia_Click(object sender, EventArgs e)
        {
            // Prende il colore selezionato dalla ComboBox
            string coloreScelto = cmbColori.SelectedItem.ToString();
            
            // Cambia il colore di sfondo in base alla scelta
            switch (coloreScelto)
            {
                case "Rosso":
                    this.BackColor = Color.Red;
                    break;
                    
                case "Verde":
                    this.BackColor = Color.Green;
                    break;
                    
                case "Blu":
                    this.BackColor = Color.Blue;
                    break;
                    
                case "Giallo":
                    this.BackColor = Color.Yellow;
                    break;
                    
                case "Arancia":
                    this.BackColor = Color.Orange;
                    break;
            }
        }
    }
}

📚 Spiegazione dello Switch

Istruzione Switch
È come un “se…allora” ma per molti casi. Controlla il valore di una variabile
e esegue codice diverso per ogni caso.

// Sintassi base:
switch (variabile)
{
    case "valore1":
        // Codice da eseguire se variabile == "valore1"
        break;
        
    case "valore2":
        // Codice da eseguire se variabile == "valore2"
        break;
        
    default:
        // Codice da eseguire se nessun case corrisponde
        break;
}

// Esempio pratico:
string giorno = "Lunedì";

switch (giorno)
{
    case "Lunedì":
        MessageBox.Show("Inizio settimana!");
        break;
        
    case "Venerdì":
        MessageBox.Show("Fine settimana!");
        break;
        
    default:
        MessageBox.Show("Giorno normale");
        break;
}

⚠️ IMPORTANTE: Ogni case deve terminare con break
per uscire dallo switch.

⏰ Esercizio 3: Inserimento Orario Lezioni

▶ Obiettivo

Assegnare una materia a una specifica fascia oraria e visualizzarla in una ListBox.
Consentire anche la rimozione di un elemento inserito in modo coerente.

1

Interfaccia

  • ComboBox (cmbMateria) per scegliere la materia
  • ComboBox (cmbOra) per scegliere l’orario
  • ListBox (lstOrario) per visualizzare le lezioni inserite
  • Button (btnAdd) per aggiungere alla lista
  • Button (btnRmn) per rimuovere la voce selezionata

2

Codice di Esempio

Form1.cs – Gestione Orario Lezioni
using System;
using System.Windows.Forms;

namespace Orario
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InizializzaMateria();
            InizializzaOrario();
        }

        // ═══════════════════════════════════════════════════════
        // METODO: Caricamento materie nella ComboBox
        // ═══════════════════════════════════════════════════════
        private void InizializzaMateria()
        {
            cmbMateria.Items.Add("Scegli materia");
            cmbMateria.Items.Add("Italiano");
            cmbMateria.Items.Add("Matematica");
            cmbMateria.Items.Add("Informatica");
            cmbMateria.Items.Add("Fisica");
            cmbMateria.Items.Add("Chimica");
            cmbMateria.SelectedIndex = 0;
        }

        // ═══════════════════════════════════════════════════════
        // METODO: Caricamento orari nella ComboBox
        // ═══════════════════════════════════════════════════════
        private void InizializzaOrario()
        {
            cmbOra.Items.Add("Scegli orario");
            cmbOra.Items.Add("8:00 - 9:00");
            cmbOra.Items.Add("9:00 - 10:00");
            cmbOra.Items.Add("10:00 - 11:00");
            cmbOra.Items.Add("11:00 - 12:00");
            cmbOra.Items.Add("12:00 - 13:00");
            cmbOra.SelectedIndex = 0;
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Aggiunta materia + orario nella ListBox
        // ═══════════════════════════════════════════════════════
        private void btnAdd_Click(object sender, EventArgs e)
        {
            // Controllo se è stata selezionata una materia valida
            if (cmbMateria.SelectedIndex == 0)
            {
                MessageBox.Show("Selezionare una materia.", 
                              "INFO", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Error);
                return;
            }
            
            // Controllo se è stato selezionato un orario valido
            if (cmbOra.SelectedIndex == 0)
            {
                MessageBox.Show("Selezionare un orario.", 
                              "INFO", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Error);
                return;
            }

            // Aggiunge materia e orario alla ListBox
            lstOrario.Items.Add(cmbMateria.SelectedItem + "   " + cmbOra.SelectedItem);
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Rimozione dell'elemento selezionato
        // ═══════════════════════════════════════════════════════
        private void btnRmn_Click(object sender, EventArgs e)
        {
            // Controllo se è stato selezionato un elemento
            if (lstOrario.SelectedIndex == -1)
            {
                MessageBox.Show("Selezionare un elemento da eliminare.", 
                              "INFO", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Error);
                return;
            }

            // Rimuove l'elemento selezionato
            lstOrario.Items.RemoveAt(lstOrario.SelectedIndex);
        }
    }
}

👥 Esercizio 4: Gestione Partecipazione al Corso

▶ Obiettivo

Inserire studenti (Nome, Cognome, Classe) in una lista di partecipanti a un corso.
Consentire anche la rimozione degli studenti inseriti.

1

Interfaccia

  • TextBox (txtNome) per il nome
  • TextBox (txtCognome) per il cognome
  • ComboBox (cmbClasse) per scegliere la classe
  • Button (btnAdd) per aggiungere lo studente al corso
  • ListBox (lstCorso) per visualizzare gli studenti iscritti
  • Button (btnRem) per rimuovere uno studente selezionato

2

Codice di Esempio (Funzionante)

Form1.cs – Gestione Partecipazione Corso
using System;
using System.Windows.Forms;

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

        // ═══════════════════════════════════════════════════════
        // METODO: Inizializza la ComboBox delle classi
        // ═══════════════════════════════════════════════════════
        private void InizializzaClassi()
        {
            cmbClasse.Items.Add("Seleziona Classe");
            cmbClasse.Items.Add("1° C");
            cmbClasse.Items.Add("2° C");
            cmbClasse.Items.Add("3° C");
            cmbClasse.Items.Add("4° C");
            cmbClasse.Items.Add("5° C");
            cmbClasse.SelectedIndex = 0;
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Aggiunta studente al corso
        // ═══════════════════════════════════════════════════════
        private void btnAdd_Click(object sender, EventArgs e)
        {
            // ─────────────────────────────────────────────────
            // STEP 1: Controllo che tutti i campi siano compilati
            // ─────────────────────────────────────────────────
            if (string.IsNullOrEmpty(txtNome.Text) || 
                string.IsNullOrEmpty(txtCognome.Text) || 
                cmbClasse.SelectedIndex == 0)
            {
                MessageBox.Show("Devi compilare tutti i campi", 
                              "ERRORE", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Error);
                return;
            }

            // ─────────────────────────────────────────────────
            // STEP 2: Creazione stringa studente
            // ─────────────────────────────────────────────────
            string studente = $"{txtNome.Text} {txtCognome.Text} - CLASSE: {cmbClasse.SelectedItem}";
            
            // ─────────────────────────────────────────────────
            // STEP 3: Aggiunta nella ListBox
            // ─────────────────────────────────────────────────
            lstCorso.Items.Add(studente);

            // ─────────────────────────────────────────────────
            // STEP 4: Reset campi per nuovo inserimento
            // ─────────────────────────────────────────────────
            cmbClasse.SelectedIndex = 0;
            txtNome.Text = "";
            txtCognome.Text = "";
        }

        // ═══════════════════════════════════════════════════════
        // EVENTO: Rimozione studente dal corso
        // ═══════════════════════════════════════════════════════
        private void btnRem_Click(object sender, EventArgs e)
        {
            // Controllo se è stato selezionato un elemento
            if (lstCorso.SelectedIndex == -1)
            {
                MessageBox.Show("Seleziona uno studente da rimuovere", 
                              "INFO", 
                              MessageBoxButtons.OK, 
                              MessageBoxIcon.Error);
                return;
            }

            // Rimuove l'elemento selezionato
            lstCorso.Items.Remove(lstCorso.SelectedItem);
        }
    }
}

📋 Riassunto Comandi Principali

ListBox – Comandi Base

Comando Cosa fa Esempio
Items.Add() Aggiunge elemento listBox1.Items.Add("Nuovo");
Items.Clear() Svuota tutta la lista listBox1.Items.Clear();
Items.RemoveAt() Rimuove in posizione listBox1.Items.RemoveAt(0);
SelectedIndex Indice selezione int pos = listBox1.SelectedIndex;
SelectedItem Elemento selezionato string sel = listBox1.SelectedItem.ToString();

ComboBox – Comandi Base

Comando Cosa fa Esempio
Items.Add() Aggiunge elemento comboBox1.Items.Add("Opzione");
Items.AddRange() Aggiunge array comboBox1.Items.AddRange(new[]{"A","B"});
SelectedIndex Indice selezione comboBox1.SelectedIndex = 0;
SelectedItem Elemento selezionato string scelta = comboBox1.SelectedItem.ToString();
Text Testo visualizzato string testo = comboBox1.Text;

✨ Spiegazione Stringa con $

Stringa Interpolata ($)
Il simbolo $ prima delle virgolette permette di inserire variabili direttamente nel testo usando { }.

// Sintassi:
string messaggio = $"Testo {variabile} testo";

// Esempi:
string nome = "Mario";
int eta = 25;

string messaggio1 = $"Ciao {nome}!";
// Risultato: "Ciao Mario!"

string messaggio2 = $"{nome} ha {eta} anni";
// Risultato: "Mario ha 25 anni"

string messaggio3 = $"Somma: {5 + 3}";
// Risultato: "Somma: 8"

💡 Consigli Pratici per Programmare Meglio

1. Prima fai funzionare, poi migliora

Non cercare la perfezione subito. Scrivi codice che funziona, poi ottimizzalo.

2. Usa nomi chiari per i controlli

txtNome invece di textBox1
btnAggiungi invece di button1
lstProdotti invece di listBox1

3. Testa ogni bottone separatamente

Verifica ogni funzione prima di passare alla successiva. Così isoli gli errori.

4. Gestisci gli errori con MessageBox

Usa MessageBox.Show() per:
• Avvisare se mancano dati
• Confermare operazioni
• Mostrare errori

5. Pulisci i campi dopo ogni operazione

Dopo aver aggiunto un elemento:
• Svuota TextBox
• Riporta ComboBox al primo elemento
• Metti il focus dove serve

6. Commenta il tuo codice

Scrivi commenti brevi che spiegano:
• Cosa fa il metodo
• Perché hai scelto quella soluzione
• Quali dati si aspettano

🎉 Ben Fatto! Hai Completato la Lezione 3

Ora sai usare ListBox e ComboBox per creare interfacce interattive!
Prova a modificare gli esercizi o crearne di tuoi per consolidare le conoscenze.

📚 Prossimo Passo: Lezione 4 – Gestione Dati con DataGridView
Torna in alto