Principales respuestas
Ayuda con ListView

Pregunta
-
holas, nesecito mostrar en un listview una consulta pero solo logro mostrar un registro, creo q falta algo o nose.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim activo As Integer
Dim activo_0_1 As String = TextBox1.Text
Try
Dim sql As String = "SELECT..."
con_db.Open()
Dim da As New MySqlDataAdapter(sql, conexion)
Dim dt As New DataTable("Tabla")
da.Fill(dt)
con_db.Close()
For Each row As DataRow In dt.Rows
activo = CStr(row.Item(7))
Next
If activo <> 1 Then
For Each row As DataRow In dt.Rows
' MsgBox(CStr(row.Item("1"))) 'Aqui si me muestra todos
Dim Horario As ListViewItem
ListView()
MiListView = New ListViewItem(row(0).ToString)
MiListView.SubItems.Add(row(1) + " " + row(2))
MiListView.SubItems.Add(row(3).ToString)
MiListView.Items.Add(Horario)
Next
Else
For Each row As DataRow In dt.Rows
' MsgBox(CStr(row.Item("1"))) 'Aqui si me muestra todos
Dim Horario As ListViewItem
ListView()
MiListView = New ListViewItem(row(0).ToString)
MiListView.SubItems.Add(row(1) + " " + row(2))
MiListView.SubItems.Add(row(3).ToString)
MiListView.Items.Add(Horario)
Next
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Subsolo me muestra el ultimo registro!
Respuestas
-
Hola:
Parece que no asignas correctamente los SubItems a la variable Horario:
Dim Horario As ListViewItem
Horario = New ListViewItem(row(0).ToString)
Horario.SubItems.Add(row(1) + " " + row(2))
Horario.SubItems.Add(row(3).ToString)MiListView.Items.Add(Horario)
Saludos- Marcado como respuesta beto60 lunes, 25 de octubre de 2010 17:26
Todas las respuestas
-
hola
no entendi muy bien que haria esta lineas
For Each row As DataRow In dt.Rows
activo = CStr(row.Item(7))
Nextsegun veo esta cargando el ultimo registro, pero lo conviertes a string cuando la variable ald efines como entero
porque no pruebas algo como esto
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim activo_0_1 As String = TextBox1.Text
Try
Dim sql As String = "SELECT..."
con_db.Open()
Dim da As New MySqlDataAdapter(sql, conexion)
Dim dt As New DataTable()
da.Fill(dt)
con_db.Close()
For Each row As DataRow In dt.Rows
Dim item As New ListViewItem(CStr(row(0)))
item.SubItems.Add(string.Format("{0} {1}", row(1), row(2))
item.SubItems.Add(CStr(row(3)))
MiListView.Items.Add(item)
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Subsaludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
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 ListViewExInherits 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 SetEnd 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 colFor 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())
NextNext row
' Finalizamos la carga de datos
'
.EndUpdate()' Indicamos cómo se visualizarán los elementos
'
.View = View.DetailsEnd 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
ThrowEnd 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]- Propuesto como respuesta Enrique M. MontejoModerator domingo, 24 de octubre de 2010 9:47
-
Hola:
Parece que no asignas correctamente los SubItems a la variable Horario:
Dim Horario As ListViewItem
Horario = New ListViewItem(row(0).ToString)
Horario.SubItems.Add(row(1) + " " + row(2))
Horario.SubItems.Add(row(3).ToString)MiListView.Items.Add(Horario)
Saludos- Marcado como respuesta beto60 lunes, 25 de octubre de 2010 17:26