lunes, 17 de junio de 2013

Suma de Totales en el Footer del ASPXGridView DevExpress por Pagina y por Todos los registros.

El GridView de DevExpress solo nos ofrece la suma de todos los registros del grid, pero si queremos los totales por pagina lo hacemos de la siguiente manera:

1- Creamos nuestros Total Summary: 
Aqui seleccionamos la columna donde se mostrará  y el nombre del campo del origen de dato (FieldName) a sumar. 

En el SummaryType establecemos Custom para que el GridView llame el evento CustomSummaryCalculate. 

En Tag una etiqueta que representa la suma por pagina y la suma del Total, esta propidad nos sirve para poner varias valores en la misma columna(SUM,AVERAGE,COUNT,ETC).


2- Creamos el evento CustomSummaryCalculate:

 Dim _dblTotal As Double
 Dim _dblPagina As Double
 Protected Sub grdResumen_CustomSummaryCalculate(ByVal sender As Object, ByVal e As DevExpress.Data.CustomSummaryEventArgs) Handles grdResumen.CustomSummaryCalculate

        Dim item As ASPxSummaryItem = TryCast(e.Item, ASPxSummaryItem)

        ' Initialization.
        If e.SummaryProcess = DevExpress.Data.CustomSummaryProcess.Start Then

            _dblTotal = 0
            _dblPagina = 0

        End If
        ' Calculation.
        If e.SummaryProcess = DevExpress.Data.CustomSummaryProcess.Calculate Then
        ' Validacion si el registro no esta revertido cuando se maneja esta acción.
            If Not e.GetValue("Revertido") Then
                _dblTotal += e.GetValue("Monto")
            End If

            'Valores de la pagina actual
            If grdResumen.GetCurrentPageRowValues("IdLlave").Contains(e.GetValue("IdLlave")) Then
                _dblPagina += e.GetValue("Monto")
            End If

        End If

        ' Finalization.
        If e.SummaryProcess = DevExpress.Data.CustomSummaryProcess.Finalize Then
            If item.Tag = "MontoTotal" Then
                e.TotalValue = String.Format("∑ {0:N2}", _dblTotal)
            End If
            If item.Tag = "MontoPagina" Then
              ' Verificamos si la suma de los montos son distinto que nos indica que hay mas de
                  una página para ocultarlo cuando solo hay una página.
                If _dblTotal <> _dblPagina Then
                    e.TotalValue = String.Format("∑ {0:N2}", _dblPagina)
                End If
            End If
        End If


    End Sub

' Este metodo tiene un la debilidad que al paginar pone la suma de la pagina que se estaba 
viendo por lo que muestra la suma de la pagina anteror. Mas adelante publicaré la solución 
de este bug.

Lo prometido es deuda y aquí les dejo la solución:

Creamos los eventos al cambiar al cambiar el tamaño de la página o al cambiar de página.
Asignamos una propiedad de JSProperties para luego leerla en el EndCallback de los Client-Side-Event del GridView para ejecutar el PerformCallback del GridView y refrescar los valores.

Protected Sub grdResumen_PageIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles grdResumen.PageIndexChanged
        grdResumen.JSProperties("cpPaginacion") = True
    End Sub

Protected Sub grdResumen_PageSizeChanged(ByVal sender As Object, ByVal e As EventArgs) Handles grdResumen.PageSizeChanged
        grdResumen.JSProperties("cpPaginacion") = True
    End Sub