In questa lezione ci occuperemo di altri due controlli di Visual Basic molto usati: ListBox, e ComboBox. Il ListBox (cerchiato in blu) e il ComboBox (cerchiato in rosso) sono utilizzati con lo stesso scopo, cioè visualizzare una lista di opzioni selezionabili dall'utente; la differenza fondamentale tra i due controlli è il modo in cui la lista è presentata. Nel ListBox, infatti, gli elementi della lista sono sempre visibili, mentre nel ComboBox la lista è "a scomparsa", ovvero è visibile soltanto se l'utente fa clic sulla freccia verso il basso a destra del controllo; nel ComboBox, inoltre, è possibile digitare un valore che non compare nella lista di quelli disponibili.
Come funziona ComboBox
Per il resto, i due controlli si comportano nello stesso modo e molte proprietà e metodi funzionano allo stesso modo. Per aggiungere valori ad un ListBox o ad un ComboBox si possono seguire due strade: utilizzare la proprietà List disponibile nella Finestra delle proprietà oppure il metodo AddItem richiamabile da codice. Vediamo un esempio di questa seconda soluzione:
List1.AddItem "Marco"
List1.AddItem "Luigi"
List1.AddItem "Andrea"
Tali istruzioni aggiungono tre valori in una ListBox; lo stesso identico codice funziona con una ComboBox, basta cambiare il nome dell'oggetto. Per eliminare tutte le voci da un elenco si deve richiamare il metodo Clear:
List1.Clear
Se, invece, si desidera eliminare un ben preciso elemento, è necessario conoscerne la posizione all'interno della lista (il cosiddetto indice). A questo proposito, è importante ricordare che l'indice delle voci ha base 0, ovvero il primo elemento di una lista ha indice 0, il secondo ha indice 1, il terzo 2, e così via. Se, ad esempio, vogliamo rimuovere il sesto elemento contenuto in un controllo ListBox, l'istruzione da utilizzare è:
List1.RemoveItem 5
Se l'indice specificato non esiste (ad esempio si tenta di cancellare il quinto elemento di una lista che ha solo quattro elementi) verrà generato un errore.
Per recuperare l'indice della voce selezionata dall'utente si deve controllare la proprietà ListIndex, sia per le ListBox sia per le ComboBox; anche in questo caso il valore restituito parte da 0. Se nessun elemento della lista è stato selezionato, il valore restituito da ListIndex sarà -1. Questa proprietà può anche essere utilizzata per selezionare da codice un particolare elemento della lista; ad esempio, se vogliamo selezionare il secondo elemento di una ListBox, è sufficiente scrivere:
List1.ListIndex = 1
Detto questo, è molto semplice rimuovere l'elemento selezionato in una lista; per compiere tale operazione, infatti, basta il comando:
List1.RemoveItem List1.ListIndex
La proprietà Text restituisce la stringa selezionata in un ListBox o visualizzata in un ComboBox. Se, invece, vogliamo conoscere il valore di un particolare elemento di una lista, possiamo utilizzare la proprietà List, che richiede come parametro l'indice dell'elemento che si vuole recuperare. Ad esempio:
MsgBox List1.List(2)
Visualizza una finestra di messaggio contenente il valore del terzo elemento della lista.
Come abbiamo già detto, le proprietà e i metodi sopra esposti sono comuni sia al controllo ListBox sia al controllo ComboBox. Qualche parola va però ancora spesa a proposito della proprietà Style del ComboBox. Essa può assumere tre valori: 0 - Dropdown combo (casella combinata a discesa, predefinita), comprende una casella di riepilogo a discesa e una casella di testo; l'utente potrà eseguire una selezione nella casella di riepilogo o digitare nella casella di testo; 1 - Simple combo (casella combinata semplice), comprende una casella di testo ed una casella di riepilogo non a discesa, cioè sempre visibile; l'utente potrà eseguire una selezione nella casella di riepilogo o digitare nella casella di testo. Le dimensioni di una casella combinata semplice si riferiscono a entrambi i componenti. Per impostazione predefinita, la casella è dimensionata in modo che nessun elemento dell'elenco sia visualizzato; per visualizzare elementi dell'elenco, aumentare il valore assegnato alla proprietà Height; 2 - Dropdown list (casella di riepilogo a discesa), questo stile consente soltanto la selezione dall'elenco a discesa.
Ora che abbiamo visto come funzionano i controlli ListBox e ComboBox, facciamo un esempio pratico del loro utilizzo, così da fissare meglio i concetti che sono stati trattati. La nostra applicazione sarà così strutturata: una ComboBox conterrà un elenco di elementi; selezionandone uno e facendo clic su un pulsante, la voce selezionata verrà inserita in una ListBox e rimossa dal ComboBox; un altro pulsante, poi, permetterà di rimuovere l'elemento dalla ListBox e di reinserirlo nella ComboBox. Come sempre, potete scaricare il form contenente solamente gli elementi dell'interfaccia nella giusta posizione, senza il codice.
Popolamento del ComboBox
Prima di tutto dobbiamo popolare il ComboBox con gli elementi che possono essere selezionati dall'utente; utilizzeremo il metodo AddItem nell'evento Form_Load, che, come abbiamo già detto, viene eseguito quando il form viene caricato in memoria. Inseriamo quindi un certo numero di voci:
Private Sub Form_Load()
Combo1.AddItem "Scheda madre"
Combo1.AddItem "Processore"
Combo1.AddItem "Monitor"
Combo1.AddItem "Videocamera"
Combo1.AddItem "Stampante"
Combo1.AddItem "Scanner"
'Seleziona il primo elemento.
Combo1.ListIndex = 0
End Sub
Operazioni con ComboBox e ListBox
Ora vogliamo fare in modo che, premendo il pulsante Inserisci, l'elemento corrente venga inserito nel ListBox e, subito dopo, venga rimosso dal ComboBox:
Private Sub Command1_Click()
'Inserisce l'elemento selezionato nel ListBox.
List1.AddItem Combo1.Text
'Rimuove l'elemento dal ComboBox.
Combo1.RemoveItem Combo1.ListIndex
If Combo1.ListCount > 0 Then
'Se ci sono ancora elementi, seleziona il primo elemento del ComboBox.
Combo1.ListIndex = 0
Else
'Altrimenti, disattiva il pulsante "Inserisci".
Command1.Enabled = False
End If
End Sub
Ogni istruzione è commentata, è necessario spendere qualche parola solo sul ciclo If... Then... Else. Dopo l'inserimento di una voce, l'elemento viene rimosso dal ComboBox; a questo punto, la routine controlla quanti elementi sono rimasti, utilizzando la proprietà ListCount: se è maggiore di 0, cioè se sono presenti ancora voci nella lista, seleziona la prima, altrimenti disattiva il pulsante, poiché non possono essere selezionati e quindi inseriti altri elementi.
Ora dobbiamo inserire il codice che verrà eseguito premendo il tasto Rimuovi: facendo clic su tale pulsante l'elemento selezionato nella ListBox verrà rimosso e reinserito nella ComboBox:
Private Sub Command2_Click()
'Innanzi tutto, controlla se è stato selezionato un elemento nel ListBox.
If List1.ListIndex >= 0 Then
'Reinserisce la voce nel ComboBox.
Combo1.AddItem List1.Text
'Rimuove l'elemento dal ListBox.
List1.RemoveItem List1.ListIndex
'Riattiva il pulsante "Inserisci".
Command1.Enabled = true
Combo1.ListIndex = 0
End If
End Sub
Notiamo che il codice viene eseguito solo se la proprietà ListIndex del ListBox è maggiore o uguale a 0, ovvero se è stato selezionato un elemento nella lista.
Abbiamo così scritto tutto il codice necessario al funzionamento del nostro esempio, che come sempre potete scaricare facendo clic qui .