Hola amantes de StackOverflow!
En este artículo os traigo un ejemplo muy sencillo para que podáis mostrar iconos en un control ListView de forma fácil, llamando a un subrutina al pulsar un control de tipo Button.
Para ello necesitaremos poner un control Listview, un control ImageList y un control de tipo botón en nuestro formulario.
La propiedad View de nuestro ListView debe estar puesta en Details y en la propiedad SmallImageList seleccionamos el control ImageList1, también deberemos agregarle al menos una columna.

Por otro lado la propiedad ColorDepth del control ImageList1 debe estar en Depth24Bit o Depth32Bit para que el icono se vea bien y no nos salga pixelado o con colores feos.

Cómo último paso, agregaremos un par de iconos al control ImageList1, que nos quedaría de este modo:

Ahora copiamos esta subrutina dentro del código de nuestro formulario. Esta subrutina lo que hace es crear un objeto de tipo ListViewItem llamado objItem con el texto que le pasemos mediante la variable ItemText y posteriormente le asigna la propiedad ImageIndex usando el íntegro que le pasemos en la variable IconImage:
1 2 3 4 5 6 7 |
Public Sub AddListViewItem(ByVal ItemText As String, ByVal IconImage As Integer) On Error Resume Next Dim objItem As ListViewItem = ListView1.Items.Add(ItemText) With objItem .ImageIndex = IconImage End With End Sub |
Y dentro del evento Click del botón Button1 pegamos este código para que nos quede así:
1 2 3 4 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click AddListViewItem("Hola Mundo", 0) 'Usar la imagen con índice = 0 en el control ImageList1 AddListViewItem("Adiós Mundo", 1) 'Usar la imagen con índice = 1 en el control ImageList1 End Sub |
Ahora, si compilamos nuestro programa y lo arrancamos podremos pulsar el botón y veremos que ahora los ítems de nuestro listview muestran un icono en el lado izquierdo.

Mostrar iconos en un subitem del control ListView
Si lo que queremos es mostrar un icono en algún subitem del control Listview1 la cosa cambia un poco, pero sigue siendo muy fácil. Lo primero que haremos será agregar más columnas al control ListView1 y poner la propiedad OwnerDraw como True, luego modificaremos el código de la subrutina para agregar algún texto en los subitems. Nos quedaría de este modo:
1 2 3 4 5 6 7 8 |
Public Sub AddListViewItem(ByVal ItemText As String, ByVal SubItemText As String, ByVal IconImage As Integer) On Error Resume Next Dim objItem As ListViewItem = ListView1.Items.Add(ItemText) With objItem .ImageIndex = IconImage .SubItems.Add(SubItemText) End With End Sub |
Dentro del evento Click del control Button1 ponemos este código para que nos quede así:
1 2 3 4 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click AddListViewItem("Hola Mundo", "Prueba1", 0) AddListViewItem("Adiós Mundo", "Prueba2", 1) End Sub |
Y dentro del evento DrawSubItem del control ListView1 ponemos este código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Private Sub ListView1_DrawSubItem(sender As Object, e As DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem On Error Resume Next Using txtbrsh As New SolidBrush(e.SubItem.ForeColor) If ListView1.SelectedIndices.Contains(e.ItemIndex) And ListView1.Focused Then e.Graphics.FillRectangle(New SolidBrush(Color.FromKnownColor(KnownColor.Highlight)), e.Bounds) txtbrsh.Color = Color.White End If Using sf As New StringFormat With {.Alignment = StringAlignment.Near, .LineAlignment = StringAlignment.Center, .FormatFlags = StringFormatFlags.NoWrap, .Trimming = StringTrimming.EllipsisCharacter} If e.Item.SubItems(1) Is e.SubItem Then e.DrawDefault = False Dim rb As New Rectangle(e.Bounds.X + e.Bounds.Height, e.Bounds.Y, e.Bounds.Width + e.Bounds.Height, e.Bounds.Height) If e.SubItem.Text = "Prueba1" Then e.Graphics.DrawImage(ImageList1.Images(0), e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height) ElseIf e.SubItem.Text = "Prueba2" Then e.Graphics.DrawImage(ImageList1.Images(1), e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height) End If e.Graphics.DrawString(e.SubItem.Text, e.SubItem.Font, txtbrsh, rb, sf) Else e.DrawDefault = True End If End Using End Using End Sub |
Si lo dejamos así tal cual, no se nos van a dibujar las columnas del control ListView1 así que también deberemos poner este código en el evento DrawColumnHeader:
1 2 3 |
Private Sub ListView1_DrawColumnHeader(sender As Object, e As DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader e.DrawDefault = True End Sub |
Nuestro programa ya debería mostrar iconos en los subitems de este modo:

Si te ha gustado este pequeño tutorial no olvides puntuarlo y compartirlo en tus redes sociales. Gracias por visitar mi blog y nos vemos en el próximo tutorial!.
Muy bien explicado!, gracias por el aporte.