Hola:
Si tu intención es rellenar un control ListView con los datos existentes en un objeto DataTable, lo mejor que puedes hacer es crearte una nueva clase que herede del control ListView, y añadirle una nueva propiedad que admita un objeto DataTable, que sea la encargada de rellenar de datos el control ListView. Dicha propiedad, bien podría llamarse «DataSource», como la tienen muchos otros controles de .NET, como el control DataGridView, ListBox, ComboBox, etc.
La nueva clase podría ser la siguiente:
Imports System.ComponentModel
''' <summary>
''' Clase extendida para el control ListView.
''' </summary>
''' <remarks></remarks>
Public Class ListViewEx
Inherits ListView
Private m_dataSource As DataTable
''' <summary>
''' Establece y devuelve el origen de datos del
''' control ListView.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
<Browsable(False)> _
Public Property DataSource() As DataTable
Get
Return m_dataSource
End Get
Set(ByVal value As DataTable)
m_dataSource = value
' Limpiamos el control ListView
Me.Items.Clear()
Me.Columns.Clear()
' Si el valor no es Nothing, rellenamos
' el control ListView.
'
If (Not (m_dataSource Is Nothing)) Then _
Fill(m_dataSource)
End Set
End Property
Private Sub Fill(ByVal dt As DataTable)
With Me
' Iniciamos la carga de datos
.BeginUpdate()
' Añadimos las columnas
'
For Each col As DataColumn In dt.Columns
.Columns.Add(col.ColumnName, 100, HorizontalAlignment.Left)
Next col
For Each row As DataRow In dt.Rows
Dim values() As Object = row.ItemArray
Dim item As New ListViewItem(values(0).ToString())
.Items.Add(item)
' Añadimos los elementos
'
For index As Integer = 1 To values.Length - 1
item.SubItems.Add(values(index).ToString())
Next
Next row
' Finalizamos la carga de datos
'
.EndUpdate()
' Indicamos cómo se visualizarán los elementos
'
.View = View.Details
End With
End Sub
End Class
Una vez que generes tu proyecto, en lugar de utilizar un control ListView, arrastra a tu formulario desde el Cuadro de Herramientas, un control ListViewEx.
Para rellenar el control, simplemente ejecutarías lo siguiente:
Try
ListViewEx1.DataSource = GetData()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Observa que a la propiedad DataSource del control ListViewEx, se le asigna el valor devuelto por un método llamado «GetData». Este método sería el encargado de conectarse con tu base de datos, y devolver un objeto DataTable como resultado de ejecutar la consulta SQL de selección que desees:
Private Function GetData() As DataTable
Try
Using cnn As New MySqlConnection(cadena_conexión)
Dim sql As String = "SELECT * FROM NombreTabla"
Dim da As New MySqlDataAdapter(sql, cnn)
Dim dt As New DataTable("Tabla")
da.Fill(dt)
Return dt
End Using
Catch ex As Exception
Throw
End Try
End Function
Fíjate de que manera tan fácil, rellenamos el objeto ListView con los datos de un objeto DataTable.
Ahora bien, si a pesar de lo indicado no deseas crear una nueva clase que herede del control ListView, estudia el código fuente existente en el método Fill de la clase ListViewEx, y lo comparas con el código fuente que tú estás ejecutando, para ver donde falla tu código para que solamente se muestre un único registro.
Un saludo
Enrique Martínez [MS MVP - VB]