Ayuda con datagridview

Necesito su ayuda urgente tengo que cargar un promedio de 100,000.00 registro en un datagridvew pero es demasiado lento hay alguna forma de de mejorar la programación para que sea, as rápida y aprovechando es que si lo hago en una cristal report voy a tener el mismo problema si o no y si es mejor con el cristal report no se si me podrías mandar una pagina que muestren ejemplos lo que quiero es que sea lo mas optimo para mi aplicación ya que manejo demasiado datos

1 respuesta

Respuesta
1

El tema de cargar los 100 mil registros no debe ser demasiado tiempo, habría que revisar cuantas columnas son por cada registro y como estas cargando los registros y ver si realmente se demora la carga del control datagrid o si es el acceso a la base de datos

Cargarlo en un reporte de Crystal igual se va a demorar el mostrar esos registros pero si acaso se demora 1 minuto y medio tal vez 2

gracias por responder creo que estas estas en linea que suerte i tienes razón tengo 23 columnas y así cargo los datos call filtrar aparte en el CellPainting para formatos de monedas eso es todo por favor ayedume y me puedes confirmar si la manera como cargo el grid es la correcta muchas gracias

Sub Filtrar()
Dim ds As New DataSet
Dim est As String = String.Empty
Dim mon As String = String.Empty
Try
If CMBestado.Text = "PENDIENTE" Then est = "P"
If CMBestado.Text = "CANCELADO" Then est = "C"
If CMBestado.Text = "ANULADO" Then est = "A"
If CMBmoneda.Text = "SOLES" Then mon = "ES"
If CMBmoneda.Text = "DOLARES" Then mon = "D"
Dim cmd As New OleDb.OleDbCommand("SELECT FACTURAS.idfactura, FACTURAS.estado as [EST], FACTURAS.formapago AS [F_PAGO], FACTURAS.idrubro, RUBROS.nomrubro AS [RUBRO], FACTURAS.idgiro, GIROS.nomgiro AS [GIRO], FACTURAS.idestacion, ESTACIONES.nomestacion AS [ESTACIÓN], FACTURAS.idcliente, CLIENTES.ruc AS [RUC], CLIENTES.razonsocial AS [RAZON_SOCIAL], FACTURAS.documento AS [DOC],FACTURAS.numfactura as [NUMERO], FACTURAS.moneda AS [MON], FACTURAS.tipodecambio AS [T/C], FACTURAS.fechaemision AS [F_EMISION], FACTURAS.fechavencimiento AS [F_VENCI], FACTURAS.totalcantidad AS [GLNS], FACTURAS.subtotal AS [SUB_TOTAL], FACTURAS.igv AS [IGV], FACTURAS.totalmonto AS [TOTAL], FACTURAS.nc AS [NC], FACTURAS.nd AS [ND], FACTURAS.pendiente AS [PENDIENTE], FACTURAS.totalcobrado AS [T_COBRADO],DateDiff('d',[fechavencimiento],'" & Now.Date & "') AS [DVENC] FROM ESTACIONES,CLIENTES ,RUBROS ,GIROS ,FACTURAS where GIROS.idgiro = FACTURAS.idgiro and RUBROS.idrubro = FACTURAS.idrubro and CLIENTES.idcliente = FACTURAS.idcliente and ESTACIONES.idestacion = FACTURAS.idestacion and FACTURAS.estado like '%" & est & "%' and FACTURAS.formapago like '%" & CMBformapago.Text & "%' AND FACTURAS.idrubro like '%" & TXTidrubro.Text & "%' AND FACTURAS.idgiro like '%" & TXTidgiro.Text & "%' AND FACTURAS.idestacion like '%" & TXTidestacion.Text & "%' AND FACTURAS.moneda like '%" & mon & "%' AND CLIENTES.ruc like '%" & TXTruc.Text.Trim & "%' AND CLIENTES.razonsocial like '%" & TXTcliente.Text.Trim & "%' ", Cn) 'ORDER BY FACTURAS.numfactura ASC
Dim da As New OleDb.OleDbDataAdapter(cmd)
da.Fill(ds)
DGVvisorfactura.DataSource = ds.Tables(0)
TXTreg.Text = ds.Tables(0).Rows.Count
DGVvisorfactura.Columns("idfactura").Visible = False
DGVvisorfactura.Columns("idrubro").Visible = False
DGVvisorfactura.Columns("idgiro").Visible = False
DGVvisorfactura.Columns("idestacion").Visible = False
DGVvisorfactura.Columns("idcliente").Visible = False
' I call it after I add the rows to my datagridview:
Me.DGVvisorfactura.Sort(DGVvisorfactura.Columns("NUMERO"), System.ComponentModel.ListSortDirection.Ascending)
'Sortable_Column is the name of the column that I've specified would be sorted Programmatic. I do that with the following line:
Me.DGVvisorfactura.Columns("NUMERO").SortMode = DataGridViewColumnSortMode.Programmatic
'One thing I've done since I posted the blog post was to change SortCompare such:
Dim TOTAL, GLNS, PENDIENTE, NC, ND, COBRADO As Double
For i = 0 To DGVvisorfactura.Rows.Count - 1
GLNS = GLNS + DGVvisorfactura.Rows(i).Cells(18).Value
TOTAL = TOTAL + DGVvisorfactura.Rows(i).Cells(21).Value
PENDIENTE = PENDIENTE + DGVvisorfactura.Rows(i).Cells(24).Value
NC = NC + DGVvisorfactura.Rows(i).Cells(22).Value
ND = ND + DGVvisorfactura.Rows(i).Cells(23).Value
COBRADO = COBRADO + DGVvisorfactura.Rows(i).Cells(25).Value
Next
TXTtotalgalonaje.Text = FormatNumber(GLNS, 3)
TXTtotal.Text = FormatNumber(TOTAL, 2)
TXTnc.Text = FormatNumber(NC, 2)
TXTnd.Text = FormatNumber(ND, 2)
TXTcobrado.Text = FormatNumber(COBRADO, 2)
TXTpendiente.Text = FormatNumber(PENDIENTE, 2)
Catch ex As Exception
MsgBox(ex.ToString())
End Try
End Sub

**********************

Private Sub DGVvisorfactura_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DGVvisorfactura.CellPainting
Me.DGVvisorfactura.Columns("SUB_TOTAL").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("IGV").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("TOTAL").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("NC").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("ND").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("PENDIENTE").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("T_COBRADO").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("T/C").DefaultCellStyle.Format = "n2"
Me.DGVvisorfactura.Columns("GLNS").DefaultCellStyle.Format = "n3"
For I = 0 To DGVvisorfactura.Columns.Count - 1
DGVvisorfactura.Columns(I).SortMode = DataGridViewColumnSortMode.NotSortable
Next
End Sub

*********************

Private Sub Grid_SortCompare(ByVal sender As Object, ByVal e As DataGridViewSortCompareEventArgs) Handles DGVvisorfactura.SortCompare
e.SortResult = CompareEx(e.CellValue1.ToString, e.CellValue2.ToString)
e.Handled = True
Exit Sub
End Sub

así me conecto y en el mdi coloco call conectar también quería decirte si es la mejor manera de conectarse a una base de datos gracias

Module conn
Public Con As OleDb.OleDbConnection
Public TABLA As String
Public SS As String
Public Sub conectar()
Cn = New OleDb.OleDbConnection
Cn.ConnectionString = "provider = Microsoft.ace.oledb.12.0;Data source = D:\GSI\GSI\bin\Debug\GSI.accdb;Jet OLEDB:Database Password="
End Sub
End Module

Varias cosas :

1. No es recomendable hacer select de la manera como lo haces pues se crean productos cartesianos, esto es al final terminas trayendo un número de registros total de todas las tablas, esto es esa manera muestra 1 registro de la tabla A tantas veces como registros tiene la tabla B, y así sucesivamente.

2. La recomendación es utilizar INNER JOIN para unir o relacionar estas 4 tablas

3. Esta bien los filtros aunque algunos desaparecen o se trasladan a los INNER JOIN

4. No entiendo porque cargas 100 mil registros si en la pantalla solo puedes ver me imagino que máximo 50 al tiempo, lo ideal es que puedas tener una especie de paginación de acuerdo al numero de registros que es pueden visualizar en la pantalla, o proporcionar filtros que reduzcan el numero de registros.

5. Solo muestras 5 columnas, o eso entiendo, en el datagrid, entonces solo trae en el select esas 5 columnas a mostrar.

bueno me haz hecho pensar jajajaj

tienes razón lo voy hacer con el insert join .

con respecto a los filtros esta bien que lo haga en la misma consulta o es mejor filtro en el datagridview (manejo mas el filtro en la consulta pero si es mas rapido optaría por el otro)

con respecto a la paginación de un datagridview supongo que cargaría solamente los primeros 50 registros y con un botón adelante y atrás donde te pasearías por los demás registro y así la carga de datos seria como un rayo me podrías facilitar un ejemplo chiquito con un solo filtro pero el filtro tendría que ser para todos los registro .

con respecto a las columnas algunas columnas las tengo ocultos por que al hacer clic con la barra espaciadora me lleva los datos visibles y ocultos al formulario facturas, quiero que me aconsejes e pensado hacerlo aparte para llevar los datos a la tabla factura para así no sea muchas columnas y sea mas rapido es factible gracias

Por lo general los filtros es mejor aplicarlos sobre la consulta a la base de datos, pues si lo haces en la grilla igual tienes en memoria una cantidad de registros que no sabes si vas a consultar o no.

Es menos costoso, que con uno de los datos de la grilla por ejemplo el id del registro lo leas de la base de datos y rellenes los datos a modificar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas