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 Module
Dentro del FormPublic 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