Guida al Visual Basic .NET
Capitolo 57° - ListBox e ComboBox
Questi controlli sono liste con stile visuale proprio in grado di contenere elementi. La gestione di tali elementi è molto simile a
quella delle List generic o degli ArrayList. L'unica differenza sta nel fatto che in questo caso, tutte le modifiche vengono rese visibili
sull'interfaccia e influiscono, quindi, su ciò che l'utente può vedere. Una volta aggiunte alla windows form, il loro aspetto sarà simile
a questo:
ListBox
ComboBox
Le proprietà più interessanti sono:
- Solo per ListBox:
- ColumnWidth : indica la larghezza delle colonne in una listbox in cui MultiColumn = True. Lasciare 0 per il valore di
default
- HorizontalExtent : indica di quanti pixel è possibile scorrere la listbox in orizzontale, se la scrollbar orizzontale è attiva
- HorizontalScrollbar : determina se attivare la scrollbar orizzontale. Di solito, questa proprietà viene impostata a True quando
la listbox dispone di più colonne
- MultiColumn : determina se la listbox è a più colonne. In questa modalità, una volta terminata l'altezza della lista, gli elementi
vengono posizionati di lato anzichè sotto, ed è quindi possibile visualizzarli spostandosi a destra o a sinistra. Un esempio visuale:
ListBox MultiColumn
- ScrollAlwaysVisible : determina se le scrollbar vengono visualizzate sempre, indipendentemente dal numero di elementi presenti. Infatti
quando questa proprietà è disabilitata, se gli elementi sono pochi e possono essere posizionati nell'area della lista senza nasconderne
nessuno, non viene visualizzata la scrollbar, che appare quando gli elementi cominciano a diventare troppi. Con questa proprietà attiva,
essa è sempre visibile e, se inutilizzata, si disabilita automaticamente
- SelectionMode : proprietà enumerata che determina in quale modo sia possibile selezionare gli elementi. Può assumere quattro valori:
None (non è possibile selezionare niente), One (un solo elemento alla volta), MultiSimple (più elementi selezionabili con un click),
MultiExtended (più elementi, selezionabili solo tenendo premuto Ctrl e spostando il mouse sopra di essi)
- Solo per ComboBox:
- AutoComplete... : tutte le proprietà il cui nome inizia per "AutoComplete" sono uguali a quelle citate nella lezione precedente
- DropDownHeight : determina l'altezza, in pixel, del menù a discesa
- DropDownStyle : determina lo stile del menù a discesa. Può assumere tre valori: Simple (il menù a discesa è sempre visibile, e
può essere assimilato a una listbox), DropDown (stile normale come nell'immagine di esempio proposta a inizio capitolo, ma è possibile
modificare il testo dell'elemento selezionato scrivendo entro la casella), DropDownList (stile normale, non è possibile modificare l'elemento
selezionato in alcun modo, se non selezionandone un altro). Questa è un'immagine di una combobox con DropDownStyle = Simple:
ComboBox Simple DropDown
- FlatStyle : lo stile visuale della ComboBox. Può assumere quattro valori: Flat o Popup (la combobox è grigia e schiacciata, senza
contorni 3D), System o Professional (la combobox è azzurra e rilevata, con contorni 3D)
- MaxDropDownItems : il numero massimo di elementi visualizzabili nel menù a discesa
- MaxLength : determina il massimo numero di caratteri di testo che possono essere inseriti come input nella casella della combobox.
Questa proprietà ha senso solo se DropDownStyle non è impostata su DropDownList, poichè tale stile impedisce di modificare il contenuto
della combobox tramite tastiera, come già detto
- Per entrambe le liste:
Detto ciò, è possibile procedere con un semplice esempio. Il programma che segue permette di aggiungere un qualsiasi testo ad una lista.
Prima di iniziare a scrivere il codice, bisogna includere nella windows form questi controlli:
- Una listbox, di nome lstItems
- Un pulsante, di nome cmdAdd, con Text = "Aggiungi"
- Un pulsante, di nome cmdRemove, con Text = "Rimuovi"
Il codice:
Public Class Form1
Private Sub cmdAdd_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles cmdAdd.Click
Dim S As String
'Inputbox(
' ByVal Prompt As Object,
' ByVal Title As String,
' ByVal DefaultResponse As String)
'Visualizza una finestra con una label esplicativa
'il cui testo è racchiuso in Prompt, con un titolo
'Title e una textbox con un testo di default
'DeafultResponse: una volta che l'utente ha inserito
'la stringa nella textbox e cliccato OK, la funzione
'restituisce la stringa immessa
S = InputBox("Inserisci una stringa:", "Inserimento stringa", _
"[Stringa]")
'Aggiunge la stringa alla lista
lstItems.Items.Add(S)
End Sub
Private Sub cmdRemove_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles cmdRemove.Click
'Se è selezionato un elemento...
If lstItems.SelectedIndex >= 0 Then
'Lo elimina
lstItems.Items.RemoveAt(lstItems.SelectedIndex)
End If
End Sub
End Class
Non solo stringhe
Nell'esempio precedente, ho mostrato che è possibile aggiungere agli elementi della listbox delle stringhe, ed esse verranno visualizzate
come testo sull'interfaccia del controllo. Tuttavia, la proprietà Items è di tipo ObjectCollection, quindi può contenere
un qualsiasi tipo di oggetto e non necessariamente solo stringhe. Quello che ci preoccupa, in questo caso, è ciò che viene
mostrato all'utente qualora noi inserissimo un oggetto nella listbox: quale testo sarà visualizzato per l'elemento?
Ecco un esempio (un form con una listbox e un pulsante):
Class Form1
Class Item
Private Shared IDCounter As Int32 = 0
Private _ID As Int32
Private _Description As String
Public ReadOnly Property ID() As Int32
Get
Return _ID
End Get
End Property
Public Property Description() As String
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
Sub New()
_ID = IDCounter
IDCounter += 1
End Sub
End Class
Private Sub btnDoSomething_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDoSomething.Click
lstItems.Items.Add(New Item() With {.Description = "Asus Eee PC 900"})
lstItems.Items.Add(New Item() With {.Description = "Hp Pavillion Dv6000"})
End Sub
End Class
Una volta premuto btnDoSomething, nella lista verranno aggiunti due oggetti, tuttavia la GUI della listbox visualizzerà questi due
elementi:
WindowsApplication4.Form1+Item
WindowsApplication4.Form1+Item
Questo nel mio caso, poiché il progetto (e quindi il namespace principale) si chiama WindowsApplication4. Da ciò si può
capire che, in assenza d'altro, la listbox tenta di convertire l'oggetto in una stringa, ossia un dato intellegibile all'uomo: l'unico modo
per poter avviare questa conversione consiste nell'utilizzare il metodo ToString, il quale, tuttavia, non è stato ridefinito dalla classe
Item e provoca l'uso del suo omonimo derivante dalla classe base Object. Quest'ultimo, infatti, restituisce il tipo dell'oggetto, che in questo
caso è proprio WindowsApplication4.Form+Item. Per modificare il comportamento del controllo, dobbiamo aggiungere alla classe un
metodo ToString, ad esempio così:
Class Item
'...
Public Overrides Function ToString() As String
Return Me.Description
End Function
End Class
Avviando di nuovo l'applicazione, gli elementi visualizzati sulla lista saranno:
Asus Eee PC 900
Hp Pavillion Dv6000
Esiste, tuttavia, un altro modo per ottenere lo stesso risultato senza dover ridefinire il metodo ToString. Questa seconda alternativa si
dimostra particolarmente utile quando non possiamo accedere o modificare il codice della classe di cui stiamo usando istanze: ad esempio
perchè si tratta di una classe definita in un assembly diverso. Possiamo specificare nella proprietà ListBox.DisplayMember
il nome della proprietà che deve servire a visualizzare l'elemento nella lista. Nel nostro caso, vogliamo visualizzare la descrizione,
quindi useremo questo codice:
lstItems.DisplayMember = "Description"
lstItems.Items.Add(New Item() With {.Description = "Asus Eee PC 900"})
lstItems.Items.Add(New Item() With {.Description = "Hp Pavillion Dv6000"})
Ed otterremo lo stesso risultato.
Parallelamente, c'è anche la proprietà ValueMember, che permette di specificare quale proprietà dell'oggetto deve
essere restituita quando si richiede il valore di un elemento selezionato mediante la proprietà SelectedValue.
A proposito dell'autore
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|