GridView.CustomSummaryCalculate Event
Allows you to manually calculate summaries. Fires for summaries whose SummaryType is SummaryItemType.Custom.
Namespace: DevExpress.XtraGrid.Views.Grid
Assembly: DevExpress.XtraGrid.v24.2.dll
Declaration
Event Data
The CustomSummaryCalculate event's data class is CustomSummaryEventArgs. The following properties provide information specific to this event:
Property | Description |
---|---|
FieldValue | Gets the processed field value. |
GroupLevel | Gets the nested level of the group whose summary value is being calculated. |
GroupRowHandle | Gets a value identifying the group row whose child data rows are involved in summary calculation. |
IsGroupSummary | Gets whether a group summary value is being calculated. |
IsTotalSummary | Gets whether a total summary value is being calculated. |
Item | Gets a summary item whose value is being calculated. |
Mode | Specifies how summaries are calculated - against all rows or for the selected rows. |
Row | Gets the currently processed row. |
RowHandle | Gets the handle of the processed row. |
SummaryProcess | Gets a value indicating calculation stage. |
TotalValue | Gets or sets the total summary value. |
TotalValueReady | Gets or sets whether the Calculation stage of the custom summary calculation process should be skipped. |
The event data class exposes the following methods:
Method | Description |
---|---|
GetGroupSummary(Int32, Object) | Returns the value of the specified group summary for the specified group row. |
GetValue(String) | Returns the value in the specified field |
Remarks
If the GridSummaryItem.SummaryType property does not equal SummaryItemType.Custom, Data Grid automatically calculates summary values. Otherwise, the CustomSummaryCalculate event raises.
During the calculation process, the CustomSummaryCalculate event repeatedly fires multiple times.
When the calculation begins, the CustomSummaryCalculate event fires with its CustomSummaryEventArgs.SummaryProcess parameter set to CustomSummaryProcess.Start. You can use this phase to set the initial CustomSummaryEventArgs.TotalValue parameter value.
In the second phase, the CustomSummaryCalculate event fires once for each row in the View (total summaries) or group (group summaries). At this stage the event’s CustomSummaryEventArgs.SummaryProcess parameter returns CustomSummaryProcess.Calculate. Read the CustomSummaryEventArgs.RowHandle and CustomSummaryEventArgs.FieldValue parameters to calculate the summary and update the CustomSummaryEventArgs.TotalValue accordingly.
When all data rows are processed, the CustomSummaryCalculate event fires for one last time. This time its CustomSummaryEventArgs.SummaryProcess parameter returns CustomSummaryProcess.Finalize. Use this stage to make final adjustments to the CustomSummaryEventArgs.TotalValue property.
In server mode, the CustomSummaryCalculate event fires only once (when the CustomSummaryProcess returns “Finalize”). Note that in this scenario the event does not fire for every row, and you can handle it to set the e.TotalValue parameter only.
gridView1.CustomSummaryCalculate += (obj, e) =>
{
e.TotalValueReady = true;
e.TotalValue = 100;
};
Refer to the Working with Summaries in Code. Custom Summaries topic for additional information.
Example
The example below creates a new custom summary items and populates it on the GridView.CustomSummaryCalculate
event. You can test this sample in our DevExpress Demo Center (the link requires Demo Center of version 16.2 or newer to be installed).
The custom summary item is located under the “Length” column. To add it, set up the GridColumn.SummaryItem property.
gridView.OptionsView.ShowFooter = true;
GridColumn column = gridView.Columns["Length"];
column.SummaryItem.SummaryType = SummaryItemType.Custom;
The CustomSummaryCalculate event handler checks the current calculation state by reading the CustomSummaryEventArgs.SummaryProcess value. Cell values are added to the total sum only if the corresponding cell under the “Mark” column is checked.
double sum = 0;
gridView.CustomSummaryCalculate += (sender, e) => {
GridView view = sender as GridView;
if (e.IsTotalSummary && (e.Item as GridSummaryItem).FieldName=="Length") {
GridSummaryItem item = e.Item as GridSummaryItem;
if (item.FieldName == "Length") {
switch (e.SummaryProcess) {
case CustomSummaryProcess.Start:
sum = 0;
break;
case CustomSummaryProcess.Calculate:
bool shouldSum = (bool)view.GetRowCellValue(e.RowHandle, "Mark");
if (shouldSum) {
sum += (double)e.FieldValue;
}
break;
case CustomSummaryProcess.Finalize:
e.TotalValue = sum;
break;
}
}
}
};
To automatically update the summary item when users check or clear the “Mark” column checkboxes, the GridView.UpdateTotalSummary method is called on the RepositoryItem.EditValueChanged event.
RepositoryItemCheckEdit edit = gridView.Columns["Mark"].RealColumnEdit as RepositoryItemCheckEdit;
edit.EditValueChanged += (sender, e) => {
//Post an editor's value to a data source
gridView.PostEditor();
//Force calculation of the total summary
gridView.UpdateTotalSummary();
};
The code below is a complete example code.
// Handle this event to calculate summary values manually
double sum = 0;
gridView.CustomSummaryCalculate += (sender, e) => {
GridView view = sender as GridView;
if (e.IsTotalSummary && (e.Item as GridSummaryItem).FieldName=="Length") {
GridSummaryItem item = e.Item as GridSummaryItem;
if (item.FieldName == "Length") {
switch (e.SummaryProcess) {
case CustomSummaryProcess.Start:
sum = 0;
break;
case CustomSummaryProcess.Calculate:
bool shouldSum = (bool)view.GetRowCellValue(e.RowHandle, "Mark");
if (shouldSum) {
sum += (double)e.FieldValue;
}
break;
case CustomSummaryProcess.Finalize:
e.TotalValue = sum;
break;
}
}
}
};
gridView.OptionsView.ShowFooter = true;
GridColumn column = gridView.Columns["Length"];
column.SummaryItem.SummaryType = SummaryItemType.Custom;
RepositoryItemCheckEdit edit = gridView.Columns["Mark"].RealColumnEdit as RepositoryItemCheckEdit;
edit.EditValueChanged += (sender, e) => {
//Post an editor's value to a data source
gridView.PostEditor();
//Force calculation of the total summary
gridView.UpdateTotalSummary();
};