Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Listbox e Combobox

Guida al Visual Basic .NET

Capitolo 57° - Listbox e Combobox

<< Precedente Prossimo >>

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:

VBNETCap26_1.jpg

ListBox


VBNETCap26_2.jpg

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:

      ListBoxMulticolumn.jpg
      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:

      ComboBoxSimple.jpg
      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:
    • DrawMode : determina la modalità con cui ogni elemento viene disegnato. Può assumere tre valori: Normal, OwnerDrawFixed e OwnerDrawVariable. Il primo è quello di default; il secondo ed il terzo specificano che i controlli devono essere disegnati da una speciale procedura definita dal programmatore nell'evento DrawItem. Per ulteriori informazioni su questo procedimento, vedere l'articolo Font e disegni nelle liste nella sezione Appunti.
    • FormatString : dato che queste liste possono contenere anche numeri e date (e altri oggetti, ma non è consigliabile aggiungere tipi diversi da quelli base), la proprietà FormatString indica come tali valori debbano essere visualizzati. Cliccando sul pulsante con i tre puntini nella finestra delle proprietà su questa voce, apparirà una finestra di dialogo con i seguenti formati standard: No Formatting, Numeric, DateTime e Scientific.
    • FormatEnabled : determina se è abilitata la formattazione degli elementi tramite FormatString
    • IntegralHeight : quando attiva, questa proprietà forza la lista ad assumere un valore di altezza (Size.Height) che sia un multiplo di ItemHeight, in modo tale che gli elementi siano sempre visibili interamente. Se disattivata, gli elementi possono anche venire "tagliati" fuori dalla lista. Un esempio:

      ListBoxIntegral.jpg
      Lista con IntegralHeight = False
    • ItemHeight : altezza, in pixel, di un elemento
    • Items : collezione a tipizzazione debole di tutti gli elementi. Gode di tutti i metodi consueti delle liste, quali Add, Remove, IndexOf, INSERT IGNORE, eccetera...
    • Sorted : indica se gli elementi devono essere ordinati alfabeticamente

    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.

<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.