Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I controlli ListBox, CheckedListBox e ComboBox

Tre controlli molto usati in Visual Basic .NET, utili per integrare nei programmi una lista di opzioni selezionabili dall'utente.
Tre controlli molto usati in Visual Basic .NET, utili per integrare nei programmi una lista di opzioni selezionabili dall'utente.
Link copiato negli appunti

I controlli ListBox, CheckedListBox e ComboBox erano già presenti in Visual Basic 6, anche se i primi due erano di fatto un unico oggetto: per visualizzare la caselle di spunta in una ListBox di VB 6 era necessario impostare la sua proprietà Style su 1 - CheckBox. In VB .NET, invece, ListBox e CheckedListBox sono due controlli separati, pur se con molti elementi in comune. Cominciamo quindi ad analizzare le proprietà che li accomunano.

La proprietà Items (disponibile anche nella ComboBox) consente di aggiungere o rimuovere elementi alla lista in modo molto più facile rispetto alle precedenti versioni di Visual Basic: premendo il pulsante con i tre puntini a destra di tale proprietà, verrà visualizzato l'Item Collection Editor in cui è possibile digitare gli elementi, uno per riga. MultiColumn deve essere impostato su true se si vuole che gli elementi della ListBox o della CheckedListBox vengano visualizzati in colonne affiancate; in questo caso, la proprietà Columnwidth consente di definire la larghezza delle colonne. La proprietà SelectionMode sostituisce ed estende la proprietà MultiSelect.

Per quanto riguarda le proprietà della ComboBox, la proprietà Style è stata rinominata in DropDownStyle. DropDownwidth consente di definire la larghezza, in pixel, dell'elenco a discesa. E' possibile anche impostare il numero di elementi da visualizzare in tale elenco, agendo sulla proprietà MaxDropDownItems.
Passando ai metodi, è interessante notare come questi controlli siano stati notevolmente potenziati, con l'aggiunta di funzionalità che prima erano disponibili solo utilizzando le API di Windows. Nel seguito faremo riferimento alla ListBox, ricordando però che le considerazioni che verranno fatte, salvo diversa indicazione, sono valide per tutti e tre i controlli oggetto di questa Lezione.

Per lavorare con gli elementi di una ListBox è necessario utilizzare i metodi della collezione Items del controllo. Ad esempio, per aggiungere un elemento ad una ListBox di nome ListBox1 è necessario scrivere:

  ListBox1.Items.Add("Nuovo elemento")

Per rimuovere una voce sono disponibili i metodi Remove e RemoveAt: il primo consente di rimuovere l'oggetto specificato, in qualunque posizione si trovi, mentre il secondo cancella l'elemento nella posizione specificata.

Ad esempio, ListBox1.Items.Remove ("Testing") rimuove l'elemento di nome Testing dalla ListBox, mentre ListBox1.Items.RemoveAt(5) elimina la sesta voce dell'elenco (ricordiamo che si inizia a contare da 0). E' da notare che se, nel primo caso, l'elemento Testing non esiste, non viene comunicato alcun messaggio, mentre se, nel secondo caso, la lista ha meno di sei elementi, si genera un errore. Altro metodo importante della collezione Items è Contains, che restituisce true se l'elemento specificato come argomento è presente nella lista, False altrimenti.

Per recuperare l'elemento attualmente selezionato nella ListBox si può usare la proprietà SelectedItem; l'indice corrispondente è conservato in SelectedIndex. Se si vogliono scorrere gli elementi selezionati è possibile usare le collezioni che gli oggetti ListBox, CheckedListBox e ComboBox mettono a disposizione; il seguente esempio mostra come conoscere gli elementi attualmente selezionati in una CheckedListBox:

  Dim Elemento As String
  For Each Elemento In CheckedListBox1.CheckedItems
   MsgBox("Elemento selezionato: " & Elemento)
  Next

Se, invece di conoscere gli elementi, fossimo stati interessati a recuperare gli indici selezionati, sarebbe stato sufficiente scorrere la collezione CheckedListBox1.CheckedIndices.

Interfaccia da realizzare

Per quanto riguarda gli eventi, ricordiamo qui soltanto SelectedIndexChanged, comune a tutti e tre i controlli, che viene generato quando si seleziona un elemento nella lista, ovvero quando si modifica la proprietà SelectedIndex del controllo.

Passiamo alla consueta realizzazione di un esempio per chiarire i concetti fin qui esposti. Vogliamo creare un'applicazione che consenta di selezionare alcuni articoli da un elenco per inserirli, ad esempio, in un ordine da stampare o inviare via posta elettronica. L'interfaccia è molto ricca di controlli, come si può vedere dall'immagine:

Nome controllo (tipo) Proprietà Valore
Panel1 (Label) Autosize
Text
true
Elementi disponibili:
ListBox 1 (ListBox)    
Button 1 (Button) Text Aggiungi>>
Button 2 (Button) Text <<Rimuovi
Label 2 (Label) Autosize
Text
true
Elementi Selezionati:
CheckedListBox1
(CheckedListBox)
CheckOnClick true
Label 4 (Label) Autosize
Text
true
<vuoto>
Label 5 (Label) Autosize
Text
true
Tipo pagamento
ComboBox 1
(ComboBox)
DropDownStyle
Items
DropDownList
Contanti/Carta Credito
Label 6 (Label) Autosize
Text
true
<vuoto>
Button 2 (Button3/) Text Calcola

Come di consueto, potete scaricare la form con il layout completo, ma senza il codice, facendo clic qui. La prima cosa da fare è riempire la ListBox1 all'avvio del programma, attraverso il seguente codice:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim I As Short
  For I = 1 To 10
   ListBox1.Items.Add(I)
  Next
  ComboBox1.SelectedIndex = 0
 End Sub

In questa routine viene anche selezionato il primo elemento della ComboBox, attraverso l'istruzione ComboBox1.SelectedIndex = 0.

Adesso vogliamo che quando il puntatore del mouse si sposta su un elemento della ListBox1, l'etichetta sottostante, Label3, visualizzi il nome dell'elemento stesso. Per fare questo usiamo il metodo IndexFromPoint e l'evento MouseMove:

 Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
  Dim Indice As Short = ListBox1.IndexFromPoint(e.X, e.Y)
  If Indice >= 0 Then
   Label3.Text = "Elemento corrente: " & ListBox1.Items(Indice)
  End If
 End Sub

Il metodo IndexFromPoint restituisce l'indice dell'elemento che si trova nella posizione del mouse specificata; in questo caso usiamo due proprietà dell'oggetto e, X e Y, per conoscere le coordinate del cursore. Se l'indice è valido, cioè è un numero maggiore o uguale a 0, visualizziamo il valore dell'elemento corrispondente leggendo l'oggetto Items di posizione Indice. Per aggiungere o rimuovere elementi da una o dall'altra lista il codice da usare è il seguente:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  If ListBox1.SelectedIndex >= 0 Then
   'Se è stato selezionato un elemento, lo aggiunge alla CheckedListBox1.
  CheckedListBox1.Items.Add(ListBox1.SelectedItem, true)
   'Rimuove l'elemento dalla ListBox1.
  ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
   End If
  End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  If CheckedListBox1.SelectedIndex >= 0 Then
   'Se è stato selezionato un elemento, lo rimette nella ListBox1.
  ListBox1.Items.Add(CheckedListBox1.SelectedItem)
   'Rimuove l'elemento dalla CheckedListBox1.
  CheckedListBox1.Items.RemoveAt(CheckedListBox1.SelectedIndex)
  End If
 End Sub

Come si vede, le due routine sono speculari. L'unica istruzione su cui spendere qualche parola è  CheckedListBox1.Items.Add(ListBox1.SelectedItem, true). Il metodo  Items.Add della  CheckedListBox è polimorfico: se viene specificato il secondo parametro e lo si pone uguale a true, la casella di spunta corrispondente all'elemento appena inserito verrà automaticamente selezionata. Sempre a riguardo dalla CheckedListBox, notiamo che, impostando la proprietà CheckOnClick su true, la casella di spunta corrispondente all'elemento su cui si fa clic verrà automaticamente selezionata o deselezionata.

L'ultima cosa che dobbiamo fare è scrivere il codice per fare in modo che, nella Label5, venga visualizzato il tipo di pagamento selezionato, utilizzando l'evento SelectedIndexChanged di cui abbiamo già parlato:

  Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
   Label5.Text = "Tipo di pagamento selezionato: " & ComboBox1.SelectedItem
  End Sub

Il codice da eseguire alla pressione del pulsante Calcola, in quanto non direttamente collegato con l'esempio, è lasciato come esercizio. L'esempio che abbiamo realizzato può essere scaricato facendo clic qui.

In questa Lezione abbiamo introdotto tre dei controlli più utilizzati. La prossima Lezione sarà incentrata sul menu, uno dei componenti fondamentali di un'applicazione Windows; come vedremo, la gestione dei menu in VB .NET è radicalmente diversa rispetto a quella delle versioni precedenti.

Ti consigliamo anche