Logo UGIdotNET

Dimensionare automaticamente le colonne di una ListView

Quando aggiungiamo degli items ad una listview in modalità report, quello che normalmente accade è questo.

Ovvero gli items non sono completamente visibili in quanto l'ampiezza delle colonne non è sufficiente per contenere il testo contenuto; ovviamente si può prevedere a design-time una larghezza tale da contenere la maggior parte degli items, ma essendo il contenuto dinamico non avremo mai la certezza che le dimensioni siano corrette e che l'utente non debba ridimensionare manualmente la dimensione delle colonne.
In realtà la ListView è 'smart' ed è in grado di ridimensionare opportunamente le colonne una volta popolata, si tratta solo di fargli sapere che siamo interessati alla cosa, il codice che segue fa proprio questo.

Public Class SetColumns
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

Public Shared Sub Adjust(ByVal Lv As ListView, ByVal AccountForHeaders As Boolean)
Const LVM_SETCOLUMNWIDTH = &H1000 + 30
Const LVSCW_AUTOSIZE = -1
Const LVSCW_AUTOSIZE_USEHEADER = -2
Dim col, lParam As Int32
If AccountForHeaders Then
    lParam = LVSCW_AUTOSIZE_USEHEADER
Else
    lParam = LVSCW_AUTOSIZE
End If
For col = 0 To Lv.Columns.Count - 1
    SendMessage(Lv.Handle, LVM_SETCOLUMNWIDTH, col, lParam)
Next
End Sub
End Class

L'utilizzo della classe statica è banale:  SetColumns.Adjust(ListView, False)

La ListView dopo la chiamata si presenta in questo modo:

Passando True come secondo parametro si ha l'effetto di rimuovere la terza colonna dalla ListView. Come potete vedere, con poco codice, i dati contenuti nelle nostre Listviews possono essere presentati in modo più 'elegante'.

Autore: Corrado Cavalli
Data: 05 aprile 2003
Ultimo aggiornamento: 23 luglio 2004
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185