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