none
Ayuda con ListView RRS feed

  • 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 Sub

    solo me muestra el ultimo registro!

    sábado, 23 de octubre de 2010 17:13

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
    lunes, 25 de octubre de 2010 11:12

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))
    Next

    segun 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 Sub

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 23 de octubre de 2010 18:05
  • 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]
    domingo, 24 de octubre de 2010 9:47
    Moderador
  • 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
    lunes, 25 de octubre de 2010 11:12