Llenar ListView desde base de datos

Escrito en Diciembre 16, 2008 por Alex

En este ejemplo como siempre lo explico utilizando la base de datos Mysql porque todos los ejemplos por la web son ya con Sql server.

Necesitamos un proyecto con un Windows Form y un ListView.

Para no complicarnos mucho vamos a poner el código desde el evento Load del formulario.

Así queda el código:

Imports System.Data
Imports MySql.Data.MySqlClient
 
Public Class Form1
    Dim Constr As String = "server=localhost;uid=user;password=mipass;database=mibase"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        Dim Con As New MySqlConnection(Constr)
        Dim Cmd As New MySqlCommand("select * from articulos", Con)
        Dim Dr As MySqlDataReader
 
        Try
            ListView1.Items.Clear()
 
            Con.Open()
            Dr = Cmd.ExecuteReader
            Dim item As New ListViewItem
            While Dr.Read()
                item = ListView1.Items.Add(CStr(Dr("upc")))
                item.SubItems.Add(CStr(Dr("descripcion")))
                item.SubItems.Add(CStr(Dr("precio")))
            End While
        Catch ex As MySqlException
            MsgBox(ex.Message)
 
        Finally
            Con.Close()
            Cmd = Nothing
            Dr = Nothing
        End Try
    End Sub
End Class

Si te gusto este artículo Suscribete a nuestro feed

36 Comentarios en “Llenar ListView desde base de datos”

  1. Martha |

    hola

    Soy nueva en esto, muchas felicidades por tu pagina muy bueno para aprender, estoy probando tus ejemplos y en uno de ellos es este como le haria si deseo eliminar un item, solo con seleccionar una de las filas y apretando “supr” o con boton que dija delete.

    espero que me alla explicado.

  2. Alex |

    Gracias Martha:
    Mira aquí esta el código adicional para que puedas suprimir un item con solo presionar la tecla SUPR.

    ‘Dentro del evento KeyDown
    Private Sub ListView1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListView1.KeyDown
    ‘Si se presiona tecla Supr
    If e.KeyCode = Keys.Delete Then
    ’si hay algun item seleccionado
    If ListView1.SelectedItems.Count > 0 Then
    ‘remueve el item
    ListView1.SelectedItems(0).Remove()
    End If
    End If
    End Sub

    Saludos…

  3. Martha |

    gracias…
    apenas lo cheque jejeje. si funciona

  4. manuel |

    hola

    oye acabe de checar tu codigo con una base de datos distinta a la tuya pero tuve un error, me dice

    “Unable to convert MySQL date/time value to System.DateTime”

    creo es pork hay un campo de tipo fecha que hago ya le busque y observe por ahi que se declara de otra forma:

    item.SubItems.Add(CDate(Dr(”fecha_nacimiento”)))

    pero ahun asi me marca error…

    agradeceria tu ayuda.

    felicidades muy buena tu pagina.

  5. Gerardo |

    hola

    tambien tengo el mismo problema, el list view no acepta campos de mysql de tipo “date” que se hace en esos casos, oyes y tambien resuelveme una duda que tengo como le hago para que al momento de hacer una busqueda de una fecha me arroge solo la fecha…

    ya que cuando vacio los datos en un textbox me da la fecha y la hora

    y yo solo quiero la hora,

    Tu pagina es muy interaesante ***(-_-)***

  6. Alex |

    Manuel:
    Creo que no es necesario convertir un valor de tipo DateTime en DateTime nuevamente.
    Lo debes de convertir a string.

    Acabo de hacer una prueba en una tabla con tres campos:

    Nombre
    Apellido
    Fecha de nacimiento

    Fecha de nacimiento es tipo DateTime (tambien existe en mysql el tipo Date e igual funcionó)

    La parte que te da el error quedó de esta manera:

    While Dr.Read()
    item = ListView1.Items.Add(CStr(Dr(”nombre”)))
    item.SubItems.Add(CStr(Dr(”apellido”)))
    item.SubItems.Add(CStr(Dr(”fecha_nacimiento”)))
    End While

    Y me muestra la fecha así en el tercer subitem:
    01/11/2001

    Lo que hacemos es convertir el valor que nos devuelve mysql de tipo Date o de tipo Datetime a tipo String y no da error.
    Si te da errores así mandame un ejemplo de tu código, dime en que version de visual basic lo haces (yo probe en 2005 y 2008) y que me suena más a que si hay un error sea porque usas alguna versión de mysql mas antigua.

  7. Alex |

    Gerardo:
    Aplica lo mismo que para manuel y para la duda que tienes del campo Date que te muestra la fecha y la hora, dejame decirte que mysql maneja un campo Date y otro Datetime, el campo Date no usa la hora por lo que solo te devolveria la fecha.

    Aun así si no te es posible cambiar el tipo de dato en mysql hay maneras de formatear una DateTime:

    TextBox1.Text = CDate(CStr(Dr(”fecha_nac”))).ToString(”dd/MM/yyyy”)

    De esta manera le pides con ayuda del método Tostring que te muestre solo los primero dos dígitos del día, dos dígitos de mes y cuatro para el año.

    MMM=Mes Abreviado (Nov, Dic …)
    MMMM= Mes Completo(noviembre)

    Respetando mayúsculas y minúsculas.

    Saludos y gracias por sus comentarios.

  8. Gerardo |

    si es cierto me funciono solo tuve que instalar un mysql mas actualizado

    gracias…

  9. Martin |

    hola

    oye y como le hare para imprimir todo el contenido del listview en papel…ho como le hago para pasarlo a un formato de excel…

    excelente pagina.

  10. Alex |

    Con el control PrintDocument y un botón puedes imprimir los datos.

    Aquí dejo el código completo, solo tienes que jugar con los márgenes, colores y posiciones.

    Public Class Form1
    Dim Item As ListViewItem
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Item = ListView1.Items.Add(”Carlos Ignacio”)
    Item.SubItems.Add(”Hernández López”)
    Item.SubItems.Add(”285456″)
    Item = ListView1.Items.Add(”Jose Luis”)
    Item.SubItems.Add(”Meza García”)
    Item.SubItems.Add(”456545″)
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim font As Font = New System.Drawing.Font(”Arial”, 9.75!, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
    Dim i As Integer
    Dim m As Integer

    For i = 0 To ListView1.Items.Count - 1
    If i = 0 Then
    m = 40
    Else
    m = i * 20 + 40
    End If
    e.Graphics.DrawString(ListView1.Items(i).Text, font, Brushes.Blue, 100, m)
    e.Graphics.DrawString(ListView1.Items(i).SubItems(1).Text, font, Brushes.Brown, 300, m)
    e.Graphics.DrawString(ListView1.Items(i).SubItems(2).Text, font, Brushes.Red, 500, m)
    Next

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim previo As New PrintPreviewDialog
    previo.Document = Me.PrintDocument1
    previo.Show()
    End Sub
    End Class

  11. Martin |

    hola…

    ok. boy a probar el codigo… gracias por tu aporte.

  12. Elena Meneses |

    Hola Alex

    muy buena esta pagina

    tengo un problema con el listview yo necesito que se me agreguen varios item pero me agrega uno solo y horizontalmente este es mi codigo.

    Dim Cmd As New MySqlCommand(”select * from productos”, Con)
    Dim Dr As MySqlDataReader

    Try
    ListView1.Items.Clear()

    Con.Open()
    Dr = Cmd.ExecuteReader
    Dim item As New ListViewItem
    While Dr.Read()
    item = ListView1.Items.Add(CInt(Dr(”Co_producto”)))
    item.SubItems.Add(CStr(Dr(”Producto”)))
    item.SubItems.Add(CStr(Dr(”Tipo_corte”)))
    item.SubItems.Add(CStr(Dr(”Precio”)))
    End While
    Catch ex As MySqlException
    MsgBox(ex.Message)

    Finally
    Con.Close()
    Cmd = Nothing
    Dr = Nothing

  13. Alex |

    Hola Elena:
    El problema esta en que estas llenando un solo item con varios subitems.
    Simplifica el código así:
    Dim Cmd As New MySqlCommand(”select * from productos”, Con)
    Dim Dr As MySqlDataReader

    Try
    ListView1.Items.Clear()

    Con.Open()
    Dr = Cmd.ExecuteReader

    While Dr.Read()
    ListView1.Items.Add(CInt(Dr(”Co_producto”)))
    ListView1.Items.Add(CStr(Dr(”Producto”)))
    ListView1.Items.Add(CStr(Dr(”Tipo_corte”)))
    ListView1.Items.Add(CStr(Dr(”Precio”)))
    End While
    Catch ex As MySqlException
    MsgBox(ex.Message)

    Finally
    Con.Close()
    Cmd = Nothing
    Dr = Nothing

    Esto hace que se llenen en vez de un item, varios items con diferentes datos.
    Espero haber entendido el problema bien.

    Saludos.

  14. jesus |

    como saber si la conslta está vacia ?? que me lo mande en un msgbox o algo por el estilo, porque al ejecutarla consulta si no hay nada… no hace nada, tal cual si no tubiera codigo la accón…

  15. Alex |

    Que tal Jesus.
    Después de ejecutar el comando puedes utilizar el metodo HasRows que te devuelve un valor lógico de verdadero o falso en caso de no encontrar datos.

    Algo así:
    Dr = Comando.ExecuteReader()

    If Dr.HasRows = False Then
    msgbox(”No existen datos”)
    End If

  16. Guillermo M. |

    K onda Alex:

    Yo se k ya paso mucho tiempo de ke pusiste este gran aporte pero me gustaria k me ayudaras yo estoy usando el Visual Basic 2005 y ps me gustaria agregar a un listview como lo haces pero si tienes una manera de aplicarlo a en Visual Basic 2005 k no sea .NET me arias un gran favor…

    O si de pura casualidad tienes la manera de bajar este programa ya hecho te lo agradeceria de ante mano nomas para entender lo que pones por favor si me lo puedes pasar a mi correo o mostrarme una pagina de donde pueda conseguir este ejemplo….o otras paginas k me recomiendes donde encuentre lo siguiente:

    Hacer conexion con una base de datos access poder agregar e eliminar de la misma desde botones y ademas otro k me diga como agregar al listview como el k hiciste y los agregue a la base de datos.

    te lo agradeceria de ante mano…

    Y si el ejemplo que tienes si me sirve el problema es k no se como implementarlo te pido disculpas pero por favor si pudieras hacerme el favor te lo agradeceria infinitamente….

  17. Alex |

    El 2005 es .Net
    Solo que quieras Visual Basic 6.0

  18. Guillermo M. |

    haaa ok… y este programa de arriba en k esta hecho????

    Este fijate que tengo un proyecto que hacer tengo enlazada la base de datos y todo con OLE… lo que quiero hacer es actualize mi base de datos cuando agrego desde los textboxs pero no lo hace solo de manera temporal nomas estan guardados en lo que esta corriendo el proyecto pero al cerrarlo ya no estan cuando checo la base o vuelvo a correr el proyecto…

    Si logro hacer que se graben en la base de datos cuando uso un DATAGRIDVIEW pero no se ve muy presentable kiero usar los textbox a ver si puedes ayudarme con eso????

    aki esta el codigo de algo k tengo:

    Imports System.Windows.Forms

    Public Class Clientes
    Dim dt As New DataTable
    Dim intFila As Integer = 0
    Private Sub Limpiar()
    TextBox1.Clear()
    TextBox2.Clear()
    TextBox3.Clear()
    TextBox4.Clear()
    TextBox5.Clear()
    TextBox1.Focus()
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ‘Es el boton para agregar datos a la base de datos
    Dim Nocli As String
    Dim NoCre As String
    Dim Nomb, Dire, Tele As String

    Nocli = TextBox1.Text
    NoCre = TextBox2.Text
    Nomb = TextBox3.Text
    Dire = TextBox4.Text
    Tele = TextBox5.Text

    Dim strConexion As String = “Provider = Microsoft.jet.OLEDB.4.0; Data Source=BaseWell.mdb”
    Dim sql As String
    sql = “INSERT INTO Clientes (NoCliente,NoCredencial,Nombre,Direccion,Telefono) Values (” + Nocli + “,” + NoCre + “,’” + Nomb + “‘,’” + Dire + “‘,’” + Tele + “‘)”
    Dim dataAdapter As New OleDb.OleDbDataAdapter(sql, strConexion)

    SetClientes1.Clear()
    OleDbDataAdapter1.SelectCommand.CommandText = sql
    OleDbDataAdapter1.Fill(SetClientes1)
    Button2.PerformClick()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    ‘Actualiza la base de datos
    OleDbDataAdapter1.Update(SetClientes1)
    MsgBox(”Se Agrego Exitosamente”)
    Limpiar()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    ‘Es el boton para Buscar
    Dim strConexion As String = “Provider = Microsoft.jet.OLEDB.4.0; Data Source=BaseWell.mdb”
    Dim strSQL As String = “SELECT * FROM Clientes”
    Dim dataAdapter As New OleDb.OleDbDataAdapter(strSQL, strConexion)
    dataAdapter.Fill(dt)
    dataAdapter.Dispose()

    Dim strBusca As String
    Dim Encontrado As Boolean = False
    Dim i As Integer

    strBusca = CStr(InputBox(”Escribe el Numero del Cliente a Buscar”, “Cliente a Buscar”))
    For i = 0 To dt.Rows.Count - 1
    If CStr(dt.Rows(i)(”NoCliente”)) = strBusca Then
    Encontrado = True
    intFila = i
    TextBox1.Text = CStr(dt.Rows(intFila)(”NoCliente”))
    TextBox2.Text = CStr(dt.Rows(intFila)(”NoCredencial”))
    TextBox3.Text = CStr(dt.Rows(intFila)(”Nombre”))
    TextBox4.Text = CStr(dt.Rows(intFila)(”Direccion”))
    TextBox5.Text = CStr(dt.Rows(intFila)(”Telefono”))
    End If
    Next
    If Not Encontrado Then
    MsgBox(”No se encontro el Numero del Cliente : ” & strBusca, , “Busqueda Finalizada”)
    End If
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    ‘El boton de salir
    OleDbDataAdapter1.Update(SetClientes1)
    MessageBox.Show(”Origen de datos Actualizado”)
    Me.Close()
    End Sub

    Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SetClientes1.Clear()
    OleDbDataAdapter1.Fill(SetClientes1)
    End Sub
    End Class

    Aver k me puedes decir al respecto o si conoces una pagina donde venga lo que busco de agregar ala base de datos desde los textbox en VB 2005 te lo agradeceria….

  19. Alex |

    Guillermo:
    Yo lo haría así:
    Imports System.Data.OleDb

    Dim Con As OleDbConnection
    Dim cmd As OleDbCommand
    Dim Dr As OleDbDataReader
    Dim ResAs Integer
    Dim sql As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As_
    System.EventArgs) Handles Button2.Click
    Try
    Con = New OleDbConnection(”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mibase.mdb;”)
    Con.Open()
    sql = “INSERT INTO Clientes (NoCliente,NoCredencial,Nombre,Direccion,Telefono) Values (” + Nocli + “,” + NoCre + “,’” + Nomb + “‘,’” + Dire + “‘,’” + Tele + “‘)”

    cmd = New OleDbCommand(sql, Con)
    res= cmd.ExecuteNonQuery
    MessageBox.Show(res) ‘este mensaje te muestra en numero de registros afectados

    Catch
    End Try
    Con.Close()
    End Sub

    Claro, aqui te pongo solo la parte del insert utilizando el método ExecuteNonQuery que solo devuleve cuantos registros fueron afectados y solo te sirve para las operaciones de Insert, update y Delete que no devuelven valores.

    Saludos.

  20. Guillermo M. |

    haaa gracias heee!!!

    si me funciono! muchas gracias man olle no necestio agregar los componentes o si???

    bueno espero que no te alla perdido mucho tiempo te agradesco de antemano por tomarte el tiempo en ayudarme gracias man lo bueno es k no fue en vano!!!

  21. Alex |

    Mientras funcione no necesitas agregar nada mas que ya este agregado.

  22. Manuel |

    que tal alex como hago para que me muestre los datos en la columna corespondiente ya que en la tabla de la base de datos tengo 3 campos nombre, apellido, calificacion pero cuando quiero mostrar los datos almacenados en el listview en donde ya tengo creadas las tres columnas, me aparesen todos los datos en la primera columna y no de manera ordenada entonces cual es la solucion

  23. Manuel |

    lo siento ya solucione el problema bien dicen que una cerbeza te ayuda a abrir la mente jejejeje de cualquier forma muchas gracias

  24. Alex |

    Bueno la solucion era poner el listview en modo details

  25. Ramon |

    alex me podrias ayudar?quiero saber como se obtiene el numero de registros en una tabla y convertirlo propiamente a numero para hacer operaciones con el utilizando mysql+visualbasic.net………me alivianarias un chingo

  26. Alex |

    Ramon: Lo otienes con la query:
    Select count(nombreCampo) from tabla

    y Lo almacenas en una variable de tipo integer o short.

  27. crysthian |

    Tengo una base de datos en excel nesecito llenar un listview con los datos de la columna a - f al dar click en un boton peron no lo he logrado!!!!!

    ayudemnme!!!!

  28. Alex |

    Crystian, es algo estenso ponerlo aqui en comentarios, pero en unos dias lo pongo en un post.

  29. guido |

    bueno yo quiero saver sobre el codigo de las 4 operaciones suma resta multiplicacion y division utilizando el if then else por favor le boya suplicar

  30. Alex |

    Guido:
    dim Tipo_operacion as string
    dim Numero1 as double
    dim Numero2 as double
    dim Resultado as double
    numero1=10
    numero2=15

    If Tipo_operacion=”suma” then
    Resultado=numero1+numero2
    else if Tipo_operacion=”resta” then
    Resultado=numero1-numero2
    else if Tipo_operacion=”multiplicacion” then
    Resultado=numero1 * numero2
    else if Tipo_operacion=”division” then
    Resultado=numero1 / numero2
    endif

    msgbox (Resultado)

    Lo ideal es usar Select Case en Vez de If else …

    Saludos.

  31. manuel |

    Estoy usando un listview como en tu ejemplo y mi duda es como puedo cambiar el ancho de las columnas del listview, lo que pasa es que cuando realizo una consulta y llamo los datos al listview no caben en el espacio en que se muestran y salta de linea y no quiero que salte.

    De antemano gracias!!

  32. Esther |

    Hola estoy probando tu ejemplo pero en mi caso la BD esta en un escritorio remoto y me marca un error en la linea de Dim Constr As String = “server=localhost;uid=user;password=mipass;database=mibase”
    como se le hace para acceder mediante escritorio remoto?????

  33. Alex |

    Manuel:
    El list view se ajusta con el mouse en el diseñador y también se ajusta desde la propiedad Width-

  34. Alex |

    Esther: Si tu base de datos esta en otro equipo, tienes que poner el nombre o la direccion IP del equipo remoto en donde dice server=localhost.
    Localhost significa Local.

  35. Javier |

    saludis alex muy buena pagina y buenas practicas q me han ayudado
    tengo una pregunta y espero me pueda responder porfavor

    esto asiendo algo similar pero en lenguaje C# y utilizo sql server 2005 y pues apenas comienso

    no tenrdas u tuto de como insertar los datos de una tabla de sql a un listview en C#???

    te lo agradeceria mucho.

  36. Alex |

    No tengo ningún tutorial en C# y el problema que por el trabajo no tengo casi tiempo de postear, pero si me da un tiempecito te lo posteo.

Escribe un comentario