Ancora su ListBox e Cicli Ancora su ListBox e cicli Oggi torniamo sulle ListBox e i cicli. Per prima cosa vogliamo mostrare come gestire le ListBox in cui vogliamo permettere una selezione multipla. Per prima cosa, lavorando con il progetto di ieri o una sua copia, selezionate la ListBox e, nella relativa finestra delle proprietà, identificate la proprietà SelectionMode (Figura 1). Figura 1 Per impostazione predefinita il valore di questa proprietà è One. In questo caso è permessa la selezione di un solo elemento. Altri valori possibili sono: None: non è possibile nessuna sezione MultiSimple e MultiExtended permettono entrambi la selezione di più valori, ma le modalità di selezione sono diverse o MultiSimple basta fare clic sui singoli elementi da selezionare. Per deselezionare un elemento selezionato, basta fare nuovamente clic su di esso. o MultiExtended per selezionare i diversi elementi occorre tenere premuto CTRL. Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 1
Scegliete uno dei valori che permettono la selezione multipla (MultiSimple o MultiExtended). Fatto questo dobbiamo correggere il codice che mostra la selezione effettuata. La proprietà SelectedItem non è più sufficiente, infatti memorizza solo l'ultimo valore selezionato. Piuttosto dobbiamo ricorrere al metodo GetSelected. Se passiamo come argomento a questo metodo un numero che indica la posizione di un elemento nella ListBox, ci viene restituito True se l'elemento è stato selezionato, altrimenti False. Correggete, dunque, la routine che gestisce il clic sul pulsante come segue Private Sub cmdmostragustiscelti_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdmostragustiscelti.click Dim strgustiscelti As String Dim intcounter As Integer strgustiscelti = "" For intcounter = 0 To lstgusti.items.count - 1 If lstgusti.getselected(intcounter) Then strgustiscelti = strgustiscelti & vbcrlf & lstgusti.items(intcounter) Next MsgBox("Hai scelto un gelato al gusto " & strgustiscelti) End Sub Per prima cosa abbiamo dichiarato due variabili, una di testo (che ci servirà per memorizzare i valori selezionati, l'altra da usare come indice per il ciclo For che segue). In questo caso abbiamo usato un ciclo diverso da quello visto ieri. Questa volta si tratta di For Next Questo tipo di ciclo viene eseguito fin che è valida la condizione posta appena dopo la parola For. In questo caso la condizione viene eseguita da quando la variabile intcounter vale zero fino a quando assume il valore lstgusti.items.count 1. La proprietà Count restituisce il numero degli elementi contenuti in una ListBox. Occorre sottrarre una unità perché la variabile parte da zero e non da 1. Come fa la variabile intcount a raggiungere il valore lstgusti.items.count 1? La variabile usata come indice del ciclo viene automaticamente incrementata di una unità ad ogni ciclo (Next). In questo modo possiamo andare a controllare, per tutti i valori della listbox se sono selezionati. Di questo controllo si occupa l'istruzione condizionale (If lstgusti.getselected(intcounter)). In pratica, ad ogni ciclo intcounter ha un valore diverso (sempre incrementato di una unità) quindi possiamo controllare uno per uno i valori della lista e vedere se sono selezionati. Se sono selezionati (cioè si verifica la condizione), il testo del valore selezionato Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 2
(lstgusti.items(intcounter)) viene concatenato al valore della proprietà strgustiscelti preceduto da un ritorno a capo. Alla fine del ciclo tutti i gusti selezionati sono inseriti nella proprietà strgustiscelti preceduti da un ritorno a capo. Poi il valore della proprietà strgustiscelti viene mostrato attraverso una finestra MsgBox (Figura 2). Figura 2 Se volessimo anche contare i gusti selezionati, basterebbe creare una variabile in cui memorizzare il numero dei gusto selezionati e incrementarla ogni volta che si trova un gusto selezionato, così Private Sub cmdmostragustiscelti_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdmostragustiscelti.click Dim strgustiscelti As String Dim intcounter As Integer Dim intgustiselezionati As Integer strgustiscelti = "" For intcounter = 0 To lstgusti.items.count - 1 If lstgusti.getselected(intcounter) Then strgustiscelti = strgustiscelti & vbcrlf & lstgusti.items(intcounter) intgustiselezionati = intgustiselezionati + 1 Next MsgBox("Hai scelto un gelato con " & intgustiselezionati & " gusti: " _ & strgustiscelti) End Sub Immaginiamo adesso di volere mettere un limite al numero di gusti che si possono selezionare. Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 3
Questo limite verrà stabilito in base alla option Button che viene selezionata (Figura 3). Ne metteremo tre (optpiccolo, optmedio e optgrande). A seconda della casella selezionata, i gusti possibili saranno 2, 3 o 4. Figura 3 Una volta che avete modificato il form, occorrerà modificare il codice del pulsante cmdmostragustiscelti come segue Private Sub cmdmostragustiscelti_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdmostragustiscelti.click Dim intmaxgustipossibili As Integer Dim strtiposcelto As String Dim strgustiscelti As String Dim intcounter As Integer Dim intgustiselezionati As Integer strgustiscelti = "" strtiposcelto = "" If optpiccolo.checked = True Then intmaxgustipossibili = 2 strtiposcelto = "Piccolo" ElseIf optmedio.checked = True Then intmaxgustipossibili = 3 strtiposcelto = "Medio" ElseIf optgrande.checked = True Then intmaxgustipossibili = 4 strtiposcelto = "Grande" For intcounter = 0 To lstgusti.items.count - 1 If lstgusti.getselected(intcounter) Then strgustiscelti = strgustiscelti & vbcrlf & lstgusti.items(intcounter) intgustiselezionati = intgustiselezionati + 1 Next Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 4
If intgustiselezionati > intmaxgustipossibili Then MsgBox("hai scelto troppi gusti" & vbcrlf & "Con il tipo " & _ strtiposcelto & " puoi scegliere al massimo " & _ intmaxgustipossibili & " gusti") Else MsgBox("Hai scelto un gelato con " & intgustiselezionati & " gusti: " & _ strgustiscelti) End Sub Innanzi tutto, abbiamo creato altre due variabili Dim intmaxgustipossibili As Integer Dim strtiposcelto As String che utilizzeremo per memorizzare il numero massimo di gusti possibili e il tipo di gelato scelto(piccolo, Medio o Grande). Assegniamo un valore a queste variabili con una istruzione if che va a verificare la proprietà Checked delle varie optionbutton. Se questa proprietà valore True, infatti, significa che la proprietà è selezionata. Alla fine del ciclo For, che non abbiamo cambiato rispetto a prima, con una nuova istruzione If controlliamo se i numero dei gusti selezionati è superiore al numero dei gusti consentiti. In questo caso mostriamo un messaggio che avvisa l'utente (Figura 4). Figura 4 In caso contrario, mostriamo il solito messaggio che elenca i gusti selezionati. Il codice funziona abbastanza, ma dobbiamo sistemare alcune cose. Innanzi tutto se l'utente non seleziona nessuno dei tipi di gelato (cioè non fa clic su nessun optionbuttan), il numero dei gusti possibili è 0 e dunque i gusti scelti sono comunque sempre troppi. Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 5
Non c'è nemmeno un controllo sul fatto che l'utente scelga effettivamente dei gusti. Un altro problema è costituito dal fatto che, se viene mostrato il messaggio che indica che si sono scelti troppi gusti e l'utente fa clic sulla MsgBox, questa si chiude, ma i gusti selezionati rimangono selezionati. Forse sarebbe meglio deselezionarli in modo che l'utente possa ricominciare da capo la sua selezione. Di tutto questo ci occuperemo domani. Alessandra Salvaggio - Merlin Wizard DMC 2010 Tutti i diritti riservati 6