jueves, 5 de marzo de 2015

Llenado óptimo de un DataGridView con una gran cantidad de Registros

jueves, 5 de marzo de 2015

Primeramente, acá no se va a discutir si es mejor usar un ListView o otro bendito control con la cual cargar datos desde una fuente tan grande como por ejemplo el de una tabla en un base de datos de SQL Server, si te sirve para otro control similar, eres un campeón!!!!, pero si no es así, mándame un correo a parte para publicarlo, si???

Estuve probando cargar una gran cantidad de datos desde un procedimiento en SQL Server, y déjenme decirles que el código anida 3 querys con mas de 10 tablas involucradas, bueno, lo cierto es que para invocar los registros en un DataGridView necesitarais asegurar el tiempo de carga, ya que esto puede originar malestar en el usuario final que por supuesto es un completo cretino que no entiende nuestros esfuerzos de brindarle una gama alta de tecnología informática a sus pies.

Verais, se que algunos optan por cargar directamente con la propiedad DataSource, y creo que es una solución más óptima de presentar rápidamente los datos en nuestro control, pero esto necesita una esquematización directa y dependiente de la sentencia SQL nativa en el Query, mejor dicho, si habeis puesto select * from tbl_datos en tu query, pues la cabecera de tus columnas en el datagridview se verá una mierda. Ademas esta el hecho de agregar columna con estilos visuales como colores y botones extras, pues es ahí donde estarais jodidos, pues entonces necesariamente tendras que recurrir a diseñar el DataGridView agregándolo con cada columna del dato que desais mostrar, pues no os preucupeies, existe siempre una solución.

Bueno yo opto por agregar las columnas mediante el diseñador del Datagridview, es más divetido ya que me da pereza en codigo puro, pero si podeis hacerlo de otra forma, es tu problema.

Bueno como ya teneis una idea a lo que me refiero pues os diré que solo falta el codigo para que esto sea una realidad. Yo use los métodos propios de mis técnicas de programación, si el tuyo es muy distinto al mió, que demonios, creo que eres lo suficientemente listo para acomodarlo a tu código fuente.

Dim sDao As New Procedimientos ' no se sentreis mucho en esta variable, es la que contiene mi clase donde están todas las funciones de consultas al sql


Dim Dt As DataTableReader  ' para este caso usare un datatablereader, si pueden hacer con un datatable purto pues estas en tu onda

Dt = sDao.query_datos("select * from tablita_pesada").CreateDataReader ' cargamos los datos al reader para recorrerlo, query_datos es la funcion en mi clase donde se invoca al sql server y demas cosas etc etc

     dg_doc.Rows.Clear() ' dg_doc es el nombre del datagridwiew, y uso el clear porque esto lo uso dentro de un sub para invocarlo desde varios eventos ya que de lo contrario me llenarian de datos repetidos

     Dim Cell As DataGridViewCell ' crea una variable con las caracteristicas de una celda de un datagridview que en primera instancia capturará el dato de cada registro recorrido
     Dim Row As DataGridViewRow ' crea una variable con las caracteristicas de una fila de un datagridview que en ultima instancia capturara los datos de las celdas por cada registro


           
           Do While Dt.Read() ' recorremos la variable reader con un loop, si saveis como hacerlo con un for pues bien
                
                'creo que el código aquí es pura deducción lógica, tampoco lo voy a explicar linea por linea, joder

                Row = New DataGridViewRow

                Cell = New DataGridViewTextBoxCell
                Cell.Value = Dt("Documento")
                Row.Cells.Add(Cell)
               
                Cell = New DataGridViewTextBoxCell
                Cell.Value = Dt("Fecha Vcto.").ToString
                Row.Cells.Add(Cell)

                             ' de esta parte me refería cuando les contabla que haveces necitamos poner algunas características que solo los podrais hacer al diseñar el datagridview
                Cell = New DataGridViewTextBoxCell
                If DateDiff(DateInterval.Day, Date.Today, Dt("Fecha Vcto.")) > 0 Then
                    Cell.Value = "Aún.."
                    Cell.Style.BackColor = Color.LightGreen

                ElseIf DateDiff(DateInterval.Day, Date.Today, Dt("Fecha Vcto.")) = 0 Then
                    Cell.Value = "Hoy!!"
                    Cell.Style.BackColor = Color.Green
                Else
                    Cell.Value = "Urgente!!"
                    Cell.Style.BackColor = Color.OrangeRed
                End If
                Row.Cells.Add(Cell)

               
                Cell = New DataGridViewCheckBoxCell
                Cell.Value = False

                Row.Cells.Add(Cell)

                            ' esta partecita es la que nos ahorra el tiempo de llenado en el DataGridView
                dg_doc.Rows.Add(Row)
            Loop



CUANDO ESTAS EN ESTA SITUACIÓN SE QUE LO MÁS COMÚN ES PONER EL SIGUIENTE CÓDIGO:

            Do While Dt.Read()

                 dg_doc.Rows.Add()
                dg_doc.Item(0, dg_doc.Rows.Count - 1).Value = Dt("Documento")
               
                dg_doc.Item(7, dg_doc.Rows.Count - 1).Value = Dt("Fecha Vcto.")

                If DateDiff(DateInterval.Day, Date.Today, Dt("Fecha Vcto.")) > 0 Then
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Value = "Aún.."
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Style.BackColor = Color.LightGreen
                ElseIf DateDiff(DateInterval.Day, Date.Today, Dt("Fecha Vcto.")) = 0 Then
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Value = "Hoy!!"
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Style.BackColor = Color.Yellow
                Else
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Value = "Urgente!!"
                    dg_doc.Item(8, dg_doc.Rows.Count - 1).Style.BackColor = Color.OrangeRed
                End If

                dg_doc.Item(9, dg_doc.Rows.Count - 1).Value = Dt("Moneda")
                dg_doc.Item(10, dg_doc.Rows.Count - 1).Value = Dt("Mto. Original")
                dg_doc.Item(11, dg_doc.Rows.Count - 1).Value = Dt("Mto. No Aplicado")
                dg_doc.Item(12, dg_doc.Rows.Count - 1).Value = Dt("Mto. No Aplicado")


            Loop

PERO SI DESEAIS QUE OS DESPIDAN DE SU TRABAJO POR NO OPTIMIZAR EL TIEMPO DE PRESENTACIÓN Y LLENADO DE SUS DATAGRIDVIEW, PUES ÁNDALE, LA DIFERENCIA ES ABISMAL, CON DECIRLES QUE CON ESTO TUVE QUE ESPERAR UN MINUTO PARA CARGAR TODA LA DATA DE LO QUE ME COSTO CASI 2 SEGUNDO CON EL CÓDIGO DE ARRIBA!!!!


Post relacionados :

Buscar

 
Copyright © 2009 .Net Solucion