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







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.
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…
gracias…
apenas lo cheque jejeje. si funciona
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.
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 ***(-_-)***
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.
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.
si es cierto me funciono solo tuve que instalar un mysql mas actualizado
gracias…
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.
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
hola…
ok. boy a probar el codigo… gracias por tu aporte.
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
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.
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…
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
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….
El 2005 es .Net
Solo que quieras Visual Basic 6.0
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….
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.
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!!!
Mientras funcione no necesitas agregar nada mas que ya este agregado.
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
lo siento ya solucione el problema bien dicen que una cerbeza te ayuda a abrir la mente jejejeje de cualquier forma muchas gracias
Bueno la solucion era poner el listview en modo details
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
Ramon: Lo otienes con la query:
Select count(nombreCampo) from tabla
y Lo almacenas en una variable de tipo integer o short.
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!!!!
Crystian, es algo estenso ponerlo aqui en comentarios, pero en unos dias lo pongo en un post.
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
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.
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!!
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?????
Manuel:
El list view se ajusta con el mouse en el diseñador y también se ajusta desde la propiedad Width-
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.
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.
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.