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'.