Articles in this section
Category / Section

How to show the sum of two column values in a summary in WinForms GridGroupingControl?

6 mins read

Summaries


In order to show the sum of two column values in a summary, custom summary can be used to customize the summary values. To create the custom summary, you can use the SummaryType.Custom option for summary row descriptor.

 

The custom summary can be created by deriving the SummaryBase class and override the methods of it. For more information about the custom summary, refer this WinForms GridGroupingControl - Summaries.

 

C#

//Sum of col2 and Col3
GridSummaryColumnDescriptor sumCol2 = GetSumSummaryColumnDescriptor("SampleData1", "SampleData2");
GridSummaryRowDescriptor rowDescriptor = new GridSummaryRowDescriptor("Row0", "Sum of SampleData1 and SampleData2 columns", new GridSummaryColumnDescriptor[] { sumCol2 });
this.gridGroupingControl1.TableDescriptor.SummaryRows.Add(rowDescriptor);

/// <summary>
/// Creating a CustomSummaary method.
/// </summary>
private void gridGroupingControl1_QueryCustomSummary(object sender, GridQueryCustomSummaryEventArgs e)
{
    if (e.SummaryDescriptor.SummaryType == SummaryType.Custom)
    {
        e.SummaryDescriptor.CreateSummaryMethod =
            new CreateSummaryDelegate(CustomSummary.CreateSummaryMethod);
    }
    e.Handled = true;
}

/// <summary>
/// Applying WeightedSummary for Given Columns
/// </summary>
private GridSummaryColumnDescriptor GetSumSummaryColumnDescriptor(string col1, string col2)
{
    GridSummaryColumnDescriptor col2Summary = new GridSummaryColumnDescriptor();
    col2Summary.Name = string.Format("{0}_{1}", col1, col2); //special name following the convention above
    col2Summary.DataMember = col1; //the column this summary is applied to
    col2Summary.DisplayColumn = col1; //where this summary is displayed
    col2Summary.Format = "{TotalSummary:#.##}"; //what is displayed in the summary
    col2Summary.SummaryType = SummaryType.Custom; //marks this as a CustomSummary
    col2Summary.Appearance.AnySummaryCell.HorizontalAlignment = GridHorizontalAlignment.Right;
    col2Summary.MaxLength = 6;
    return col2Summary;
}
 VB
' Sum of col2 and col3
Dim sumCol2 As GridSummaryColumnDescriptor = GetSumSummaryColumnDescriptor("SampleData1", "SampleData2")
Dim rowDescriptor As New GridSummaryRowDescriptor("Row0", "Sum of SampleData1 and SampleData2 columns", New GridSummaryColumnDescriptor() {sumCol2})
Me.gridGroupingControl1.TableDescriptor.SummaryRows.Add(rowDescriptor)

''' <summary>
''' Creating a CustomSummaary method.
''' </summary>
Private Sub gridGroupingControl1_QueryCustomSummary(ByVal sender As Object, ByVal e As GridQueryCustomSummaryEventArgs)
    If e.SummaryDescriptor.SummaryType = SummaryType.Custom Then
        e.SummaryDescriptor.CreateSummaryMethod = New CreateSummaryDelegate(AddressOf CustomSummary.CreateSummaryMethod)
    End If
    e.Handled = True
End Sub

''' <summary>
''' Applying WeightedSummary for Given Columns
''' </summary>
Private Function GetSumSummaryColumnDescriptor(ByVal col1 As String, ByVal col2 As String) As GridSummaryColumnDescriptor
    Dim col2Summary As New GridSummaryColumnDescriptor()
    col2Summary.Name = String.Format("{0}_{1}", col1, col2) ' special name following the convention above
    col2Summary.DataMember = col1 ' the column this summary is applied to
    col2Summary.DisplayColumn = col1 ' where this summary is displayed
    col2Summary.Format = "{TotalSummary:#.##}" ' what is displayed in the summary
    col2Summary.SummaryType = SummaryType.Custom ' marks this as a CustomSummary
    col2Summary.Appearance.AnySummaryCell.HorizontalAlignment = GridHorizontalAlignment.Right
    col2Summary.MaxLength = 6
    Return col2Summary
End Function
CustomSummary class customization

C#

/// <summary>
/// Syncfusion Custom Summary class that computes the weighted average of the of entries 
/// where the weights come in from a column passed in through a naming convention. 
/// </summary>
public sealed class CustomSummary : SummaryBase
{
    #region "API Definition"

    double _valTotal;
    double _wgtTotal;
    public static readonly CustomSummary Empty = new CustomSummary(0, 0);

    #endregion

    #region Constructor
    public CustomSummary()
    {

    }

    /// <summary>
    /// Initializes a new summary object.
    /// </summary>
    /// <param name="valTotal"></param>
    /// <param name="wgtTotal"></param>
    public CustomSummary(double valTotal, double wgtTotal)
    {
        _wgtTotal = wgtTotal;
        _valTotal = valTotal;
    }

    #endregion

    #region CreateSummaryMethod
    /// <summary>
    /// Assign this CreateSummaryDelegate handler method to SummaryDescriptor.CreateSummaryMethod 
    /// </summary>
    /// <param name="sd"></param>
    /// <param name="record"></param>
    /// <returns></returns>
    public static ISummary CreateSummaryMethod(SummaryDescriptor sd, Record record)
    {
        object obj = sd.GetValue(record);
        bool isNull = (obj == null || obj is DBNull);
        if (isNull)
        {
            return Empty;
        }
        else
        {
            int i = sd.Name.LastIndexOf('_') + 1;
            string col2 = sd.Name.Substring(i);
            object obj1 = record.GetValue(col2);
            if (obj1 == null)
            {
                throw new ArgumentException(string.Format("[{0}] not a column.", col2));
            }

            double col2Value = Convert.ToDouble(obj1);
            double col1 = Convert.ToDouble(obj);

            return new CustomSummary(col1, col2Value);
        }
    }

    #endregion

    #region "Weighted Summary Calculation"        
    /// <summary>
    /// The running weighted sum of this summary
    /// </summary>
    public double TotalSummary
    {
        get
        {
            if (_wgtTotal == 0)
                return _wgtTotal;
            return _valTotal + _wgtTotal;
        }
    }

    /// <summary>
    /// Combines this summary information with another objects summary and returns a new object.  
    /// </summary>
    /// <param name="other"></param>
    /// <returns></returns>
    /// <remarks>
    /// This method must honor the immutable characteristics of summary objects and return 
    /// a new summary object instead of modifying an existing summary object.
    /// </remarks>
    public override SummaryBase Combine(SummaryBase other)
    {
        return Combine((CustomSummary)other);
    }

    /// <summary>
    /// Combines this summary information with another objects summary and returns a new object.  
    /// </summary>
    /// <remarks>
    /// This method must honor the immutable characteristics of summary objects and return 
    /// a new summary object instead of modifying an existing summary object.
    /// </remarks>
    public CustomSummary Combine(CustomSummary other)
    {
        // Summary objects are immutable. That means properties cannot be modified for an 
        // existing object. Instead every time a change is made a new object must be created (just like 
        // System.String). 
        return new CustomSummary(this._valTotal + other._valTotal, this._wgtTotal + other._wgtTotal);
    }

    /// <override/>
    public override string ToString()
    {
        return String.Format("TotalSummary = {0:0.00}", TotalSummary);
    }
    #endregion
}

VB

''' <summary>
''' Syncfusion Custom Summary class that computes the weighted average of the of entries 
''' where the weights come in from a column passed in through a naming convention. 
''' </summary>
Public NotInheritable Class CustomSummary
    Inherits SummaryBase
#Region "API Definition"

    Private _valTotal As Double
    Private _wgtTotal As Double
    Public Shared ReadOnly Empty As New CustomSummary(0, 0)

#End Region

#Region "Constructor"
    Public Sub New()
    End Sub
    ''' <summary>
    ''' Initializes a new summary object.
    ''' </summary>
    ''' <param name="valTotal"></param>
    ''' <param name="wgtTotal"></param>
    Public Sub New(ByVal valTotal As Double, ByVal wgtTotal As Double)
        _wgtTotal = wgtTotal
        _valTotal = valTotal
    End Sub

#End Region

#Region "CreateSummaryMethod"
    ''' <summary>
    ''' Assign this CreateSummaryDelegate handler method to SummaryDescriptor.CreateSummaryMethod 
    ''' </summary>
    ''' <param name="sd"></param>
    ''' <param name="record"></param>
    ''' <returns></returns>
    Public Shared Function CreateSummaryMethod(ByVal sd As SummaryDescriptor, ByVal record As Record) As ISummary
        Dim obj As Object = sd.GetValue(record)
        Dim isNull As Boolean = (obj Is Nothing OrElse TypeOf obj Is DBNull)
        If isNull Then
            Return Empty
        Else
            Dim i As Integer = sd.Name.LastIndexOf("_"c) + 1
            Dim col2 As String = sd.Name.Substring(i)
            Dim obj1 As Object = record.GetValue(col2)
            If obj1 Is Nothing Then
                Throw New ArgumentException(String.Format("[{0}] not a column.", col2))
            End If

            Dim col2Value As Double = Convert.ToDouble(obj1)
            Dim col1 As Double = Convert.ToDouble(obj)
            Return New CustomSummary(col1, col2Value)
        End If
    End Function

#End Region

#Region "Weighted Summary Calculation"
    ''' <summary>
    ''' The running weighted sum of this summary
    ''' </summary>
    Public ReadOnly Property TotalSummary() As Double
        Get
            If _wgtTotal = 0 Then
                Return _wgtTotal
            End If
            Return _valTotal + _wgtTotal
        End Get
    End Property

    ''' <summary>
    ''' Combines this summary information with another objects summary and returns a new object.  
    ''' </summary>
    ''' <param name="other"></param>
    ''' <returns></returns>
    ''' <remarks>
    ''' This method must honor the immutable characteristics of summary objects and return 
    ''' a new summary object instead of modifying an existing summary object.
    ''' </remarks>
    Public Overrides Function Combine(ByVal other As SummaryBase) As SummaryBase
        Return Combine(CType(other, CustomSummary))
    End Function

    ''' <summary>
    ''' Combines this summary information with another objects summary and returns a new object.  
    ''' </summary>
    ''' <remarks>
    ''' This method must honor the immutable characteristics of summary objects and return 
    ''' a new summary object instead of modifying an existing summary object.
    ''' </remarks>
    Public Function Combine(ByVal other As CustomSummary) As CustomSummary
        ' Summary objects are immutable. That means properties cannot be modified for an 
        ' existing object. Instead every time a change is made a new object must be created (just like 
        ' System.String).   
        Return New CustomSummary(Me._valTotal + other._valTotal, Me._wgtTotal + other._wgtTotal)
    End Function

    ''' <override/>
    Public Overrides Function ToString() As String
        Return String.Format("TotalSummary = {0:0.00}", TotalSummary)
    End Function
#End Region
End Class
Summary for two columns as shown in the screenshot below

Show the summaries for two columns


Samples:

C#: Summary_of_Two_Columns

VB: Summary_of_Two_Columns

 

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please  to leave a comment
Access denied
Access denied