Listview con Base de datos SQLCompact 4.0
Visitando diferentes foros y blogs, acerca de usar DatagridView o Listview para presentar datos, decidí poner a prueba los controles, sin duda que las Datagridview se tardan en cargar datos que sobrepasen los 10 campo y las 1000 filas, sin embargo la fácil edición y referencia a la estructura interna de la misma la hace manejable y apreciable por la mayor parte de programadores NET si vamos por el listview, un control mas sencillo que si bien integra también campos y diferentes vistas ha sido usado en la mayoría de aplicaciones hasta hoy en día.
Usando la base de datos Northwind.sdf que trae el sql compact y creando la conexión idéntica a las formas en los posts antes demostrados conectamos nuestro listview a ver que parece, miren los controles usados en la captura del proyecto.
Como el método de carga de datos de este control, no esta sencilla a diferencia de datagridview que simplemente con el datasource = dt, el problema esta resuelto!! . He optado por hacer una función de cargar, colocada en el mismo módulo de conexión con el carácter de publica para que tenga acceso libre en todo el ámbito del proyecto y sea reutilizada con solamente colocar el dt(datatable cargado por consulta ) y el listview usado.
Vemos el código del modulo
Module conex Public path As String = Form1.lbldir.Text '---------------------------------------- Public conn As New SqlCeConnection("Data Source=" & path) Public sql As String Public cmd As New SqlCeCommand(sql, conn) Public Sub conectarse() Try conn.Open() ' MsgBox("Conexion exitosa") Catch ex As Exception MsgBox(ex.ToString()) End Try End Sub #Region "CARGAR LISTVIEW" Public Function Cargar_listview(ByRef lvw As ListView, ByRef dt As DataTable) lvw.Clear() lvw.View = View.Details lvw.GridLines = True 'adquiere los campos y encabezados para el listview For Each Col As DataColumn In dt.Columns lvw.Columns.Add(Col.ColumnName, Col.ColumnName) Next If dt.Columns.Count = 0 Then MsgBox("No existen columnas para llenar listview") Else 'llena el listview For Each row As DataRow In dt.Rows Dim item As ListViewItem item = New ListViewItem item.Text = row(0).ToString() For intcontador As Integer = 1 To dt.Columns.Count - 1 item.SubItems.Add(row(intcontador).ToString()) Next lvw.Items.Add(item) Next lvw.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize) End If End Function #End Region End ModuleDentro del Form
Public Class Form1 Private Sub btncargar_Click(sender As Object, e As EventArgs) Handles btncargar.Click cargar_datos() End Sub Sub cargar_datos() ' procedimiento para cargar los datos Try conectarse() Dim dt As New DataTable Dim strSql As String = "SELECT* FROM PRODUCTS " Dim adp As New SqlServerCe.SqlCeDataAdapter(strSql, conn) adp.Fill(dt) Cargar_listview(ListView1, dt) Catch ex As Exception ex.ToString() End Try conn.Close() End Sub Public Sub buscar() Try Dim dt As New DataTable Dim strSql As String If TextBox1.Text = "" Then MsgBox("Ingrese código para buscar", vbInformation) ElseIf IsNumeric(TextBox1.Text) = True Then strSql = "SELECT * FROM PRODUCTS WHERE [CATEGORY ID] =" & TextBox1.Text ElseIf Not IsNumeric(TextBox1.Text) = True Then strSql = "SELECT * FROM PRODUCTS WHERE [PRODUCT NAME] LIKE '%" & TextBox1.Text & "%'" End If Dim adp As New SqlServerCe.SqlCeDataAdapter(strSql, conn) adp.Fill(dt) Cargar_listview(ListView1, dt) Catch ex As Exception ex.ToString() End Try conn.Close() End Sub Private Sub btnFiltrar_Click(sender As Object, e As EventArgs) Handles btnFiltrar.Click buscar() End Sub Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged buscar() End Sub End Class
Una captura ejecutando
...cargando y la segunda captura filtrando por [CATEGORY ID]
Al final comprobé que si existe una mejora en el tiempo de carga del listview vs datagridview, pero Uds. experimenten y juzguen a su criterio.
Y eso es todo! nos vemos en otra entrega, les dejo el link de mi ejemplo:
Comentarios
Publicar un comentario