Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

Step 4: Display Summaries

  • 3 minutes to read

You can display summary information about the groups of rows or individual data columns. Complete the following steps:

  1. Process summaries in the virtual source.
  2. Display summaries in the GridControl.

Virtual Source Tutorial - Summaries

Explore the full source code in the following examples and demos:

Infinite Scrolling Source
View Example Run Demo
Paged Source
View Example Run Demo

#Summary Types

The Issues Service allows you to obtain:

  • The total count of rows.
  • The last created DateTime object.
C#
public class IssuesSummaries {   
    public int Count { get; private set; }
    public DateTime? LastCreated { get; private set; }
}

#Implementation Details

#Process Summaries in the Virtual Source

  1. Create a task that uses the IssuesService.GetSummariesAsync method to get summaries from the data source.

  2. Use the Summaries property to get GridControl summary items.

  3. Create a GetTotalSummaries command.

  4. Get the list of data source summaries that correspond to GridControl summary items and assign the list to the Result property.

  5. Bind the GetTotalSummaries command to the InfiniteAsyncSource.GetTotalSummariesCommand.

C#
[Command]
public void GetTotalSummaries(GetSummariesAsyncArgs args) {
    args.Result = GetTotalSummariesAsync(args);
}
static async Task<object[]> GetTotalSummariesAsync(GetSummariesAsyncArgs args) {
    var summaryValues = await IssuesService.GetSummariesAsync((IssueFilter)args.Filter);
    return args.Summaries.Select(x => {
        if(x.SummaryType == SummaryType.Count)
            return (object)summaryValues.Count;
        if(x.SummaryType == SummaryType.Max && x.PropertyName == "Created")
            return summaryValues.LastCreated;
        throw new InvalidOperationException();
    }).ToArray();
}
xml
<dxg:GridControl.ItemsSource>
    <dx:InfiniteAsyncSource ElementType="{x:Type local:IssueData}"
                            FetchRowsCommand="{Binding FetchIssuesCommand}"
                            GetUniqueValuesCommand="{Binding GetUniqueValuesCommand}"
                            GetTotalSummariesCommand="{Binding GetTotalSummariesCommand}"/>
</dxg:GridControl.ItemsSource>

#Display Fixed Summary Panel

Enable the DataViewBase.ShowFixedTotalSummary property to display the Fixed Summary Panel:

#Display Total Summaries

Specify the GridControl.TotalSummary property to display total summaries in the GridControl:

xml
<dxg:GridControl.TotalSummary>
    <dxg:GridSummaryItem SummaryType="Count" Alignment="Right"/>
    <dxg:GridSummaryItem SummaryType="Max" FieldName="Created" 
                         DisplayFormat="{}Last created: {0}" 
                         Alignment="Right"/>
</dxg:GridControl.TotalSummary>

#Display Custom Summaries

The Issues Service can calculate the Median and StdDev values:

C#
public class IssuesSummaries {
    // ...
    public double VotesMedian { get; private set; }
    public double VotesStdDev { get; private set; }
}

Virtual Source Tutorial - Display Custom Summaries

  1. Process summaries in the virtual source:

    C#
    [Command]
    public void GetTotalSummaries(GetSummariesAsyncArgs args) {
        args.Result = GetTotalSummariesAsync(args);
    }
    static async Task<object[]> GetTotalSummariesAsync(GetSummariesAsyncArgs args) {
        var summaryValues = await IssuesService.GetSummariesAsync((IssueFilter)args.Filter);
        return args.Summaries.Select(x => {
            if (x.SummaryType == SummaryType.Count)
                return (object)summaryValues.Count;
            if (x.SummaryType == SummaryType.Max && x.PropertyName == "Created")
                return summaryValues.LastCreated;
    
            // Custom Summaries
            if (x.SummaryType == SummaryType.Custom && x.PropertyName == "Votes") {
                var tag = x.Tag as string;
                if (tag == "Median")
                    return summaryValues.VotesMedian;
                if (tag == "StdDev")
                    return summaryValues.VotesStdDev;
            }
            throw new InvalidOperationException();
        }).ToArray();
    } 
    
  2. Display summaries in the GridControl:

    xml
    <dxg:GridControl.TotalSummary>
        <dxg:GridSummaryItem SummaryType="Count" Alignment="Right"/>
        <dxg:GridSummaryItem SummaryType="Max" FieldName="Created" 
                             DisplayFormat="{}Last created: {0}" Alignment="Right"/>
        <!-- Custom Summaries -->
        <dxg:GridSummaryItem SummaryType="Custom" Tag="StdDev" FieldName="Votes" 
                             DisplayFormat="{}Votes StdDev={0}" Alignment="Right"/>
        <dxg:GridSummaryItem SummaryType="Custom" Tag="Median" FieldName="Votes" 
                             DisplayFormat="{}Votes Median={0}" Alignment="Right"/>
    </dxg:GridControl.TotalSummary> 
    

#Continue

Tutorial 5: Enable Data Edit Operations