Il lavoro con le ListBox

Ultima modifica: 29-05-2016

Le ListBox

Sulle ListBox abbiamo già parlato in altre occasioni ma questa volta vale la pena riprendere l'argomento perchè nel lavoro presentato recentemente abbiamo usato nuove tecniche.

Riempimento veloce di una ListBox con le matrici

Nei nostri lavori siamo abituati a popolare le nostre ListBox usando degli opportuni cicli ed usando l'ormai famoso Additem.

Se i dati sono contenuti in una matrice a due dimensioni (Riga e Colonna) occorre in ogni caso indicare che esigiamo una ListBox che abbia tante colonne quanti sono i campi dei records memorizzati nella matrice:

ListBox1.ColumnCount = numCampi

Fatto questo, normalmente, eseguiamo le seguenti operazioni:

For Record = 1 To numRec
ListBox3.AddItem
For Campi = 1 To numCampi
' gli indici di riga e colonna in una ListBox è a base 0 (zero)
ListBox3.List(Record - 1, Campi - 1) = Matrice(Record, Campi)
Next
Next

Per popolare una ListBox col contenuto di una matrice abbiamo la possibilità di usare una sola istruzione, che ci consente di raggiungere lo stesso risultato.

ListBox1.List() = Matrice

oppure

ListBox1.Column() = Matrice

Ma attenzione: le due istruzioni non sono equivalenti.

La prima di queste due istruzioni trasferisce nella ListBox i dati contenuti nella matrice, rispettando l'ordine di riga e di colonna e va bene per una matrice progettata per conservare la disposizione tradizionale di una tabella standard:

La seconda istruzione, prima di trasferire il contenuto della matrice nella ListBox ne traspone l'ordine. Una matrice, costruita come quella da noi progettata nei precedenti articoli (schema di sinistra), prima viene ruotata, poi trascritta nella ListBox permettendone la visualizzazione standard (schema di destra)

  rec1 rec2 rec3 rec4 rec5 rec6 rec7
campo 1              
campo 2              
campo 3              
  campo1 campo 2 campo3
rec1      
rec2      
rec3      
rec4      
rec5      
rec6      
rec7      

Eliminazione di una riga da un elenco della ListBox

L'istruzione richiede che sia indicata la riga da eliminare:

ListBox2.RemoveItem (ListBox2.ListIndex)

Con questa istruzione diciamo al compilatore di rimuovere la riga selezionata (ListBox2.ListIndex). In questo caso, contrariamente a quanto visto in Il lavoro con le Matrici, l'elenco della ListBox si compatta automaticamente senza codice aggiuntivo.

Se nessuna riga è selezionata o la ListBox è vuota, viene generato un errore per cui è bene mettere prima di questa istruzione un controllo del genere:

If ListBox2.ListIndex = -1 Then Exit Sub

Ne consegue che nella routine che esegue questo compito si scrivano nell'ordine queste istruzioni:

If ListBox2.ListIndex = -1 Then Exit Sub

ListBox2.RemoveItem (ListBox2.ListIndex)

e con questo è tutto per questa funzionalità.

Aggiunta di una nuova riga in mezzo ad un elenco della ListBox

La sintassi che si usa per inserire una riga in mezzo alle righe già presenti in una ListBox è simile a quella appena vista.

Questo tipo di istruzione lo vediamo collegato ai pulsanti Sposta in Giù e Sposta in Su della UserForm1 del nostro file di esempio.

L'istruzione che siamo abituati ad usare per aggiungere una nuova riga in fondo alla lista di una ListBox è:

ListBox2.AddItem [elemento] '(facoltativo: se omesso viene semplicemente aggiunta una riga vuota, se espresso l'elemento viene scritto nella nuova riga vuota)

Questa istruzione aggiunge semplicemente una riga alla fine della lista.

La nuova istruzione che in quella circostanza abbiamo visto è lievemente più complessa. ma non troppo. Infatti è sufficiente aggiungere dopo la normale sintassi sopra riportata, anche l'indicazione della riga dove inserire quella nuova:

ListBox2.AddItem [elemento [, numeroRiga]].

che può essere:

ListBox1.AddItem , ListBox1.ListIndex

oppure

ListBox1.AddItem "Elemento", ListBox1.ListIndex

Per eseguire questa operazione, anche se i due parametri sono facoltativi, dobbiamo indicare almeno il numero della riga , dopo una virgola, dove effettuare l'inserimento della nuova riga, pena l'aggiunta di una nuova riga alla fine della lista.

Nel nostro file di esempio l'istruzione la vediamo espressa in questa forma:

ListBox2.AddItem ListBox2.Text, ListBox2.ListIndex + 2

oppure:

ListBox2.AddItem ListBox2.Text, ListBox2.ListIndex - 1

Con queste due istruzioni esigiamo che venga inserita una nuova riga rispettivamente due posizioni sotto a quella corrente (ListBox2.ListIndex + 2) o una posizione sopra quella corrente (ListBox2.ListIndex - 1) e di copiarvi l'elemento selezionato (ListBox2.Text).

Le due istruzioni sono state prelevate dalle routines della UserForm1 relativa alla scelta dei campi e compiono rispettivamente le azioni Sposta giù e Sposta su e che per un agevole confronto, riscrivo qui di seguito, affiancate.

Per l'uso di queste due routines si suppone che la ListBox sia già popolata. La posizione della nuova riga da aggiungere, in questo caso, viene calcolata in base alla selezione corrente e vi si scrive quel che si trova nella riga selezionata. Quindi la si seleziona e si provvede all'eliminazione della riga precedentemente selezionata. In queste due routines vengono quindi usate le due nuove metodologie.

Sposta sù Sposta giù
Private Sub CommandButton4_Click()
' su
' se la riga da spostare in su si trova prima della seconda
' riga è inutile eseguire lo spostamento in su
' più su della prima posizione non si può andare
If ListBox2.ListIndex < 1 Then Exit Sub
' la riga va aggiunta una posizione più in
' alto della riga selezionata
ListBox2.AddItem ListBox2.Text, ListBox2.ListIndex - 1
ListBox2.ListIndex = ListBox2.ListIndex - 2
ListBox2.RemoveItem ListBox2.ListIndex + 2
End Sub
Private Sub CommandButton3_Click()
' giù
If ListBox2.ListIndex = -1 Then Exit Sub
' se la riga da spostare in giù si trova oltre la penultima
' posizione è inutile eseguire lo spostamento
If ListBox2.ListIndex > ListBox2.ListCount - 2 Then Exit Sub
' la riga va aggiunta due posizioni più in
' basso della riga selezionata
ListBox2.AddItem ListBox2.Text, ListBox2.ListIndex + 2
ListBox2.ListIndex = ListBox2.ListIndex + 2
ListBox2.RemoveItem ListBox2.ListIndex - 2
End Sub