6 Answers, 1 is accepted
In order to add a summary row at the master level that aggregates data from the child template, you can create a custom GridViewSummaryItem and override its Evaluate method where you can control how exactly the calculation is executed. In the below sample code snippet it is demonstrated how to iterate the child rows and sum the UnitPrice field for each product:
private void RadForm1_Load(object sender, EventArgs e){ this.productsTableAdapter.Fill(this.nwindDataSet.Products); this.categoriesTableAdapter.Fill(this.nwindDataSet.Categories); radGridView1.AutoGenerateHierarchy = true; radGridView1.DataSource = this.nwindDataSet; radGridView1.DataMember = "Categories"; this.radGridView1.MasterTemplate.BestFitColumns(Telerik.WinControls.UI.BestFitColumnMode.AllCells); this.radGridView1.MasterTemplate.Templates[0].BestFitColumns(Telerik.WinControls.UI.BestFitColumnMode.AllCells); CustomSummaryItem summaryItem = new CustomSummaryItem("Description", "Total price: {0}", GridAggregateFunction.Count); GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem(); summaryRowItem.Add(summaryItem); this.radGridView1.SummaryRowsTop.Add(summaryRowItem);}public class CustomSummaryItem : GridViewSummaryItem{ public CustomSummaryItem(string name, string formatString, GridAggregateFunction aggregate) : base(name, formatString, aggregate) { } public override object Evaluate(IHierarchicalRow row) { decimal total = 0; foreach (GridViewRowInfo dataRow in row.ChildRows) { foreach (GridViewRowInfo childRow in dataRow.ChildRows) { total += (decimal)childRow.Cells["UnitPrice"].Value; } } return total; }}You can refer to the following help article which last section also demonstrates a sample approach: https://docs.telerik.com/devtools/winforms/gridview/rows/summary-rows
I hope this information helps.
Regards,
Dess | Tech Support Engineer, Sr.
Progress Telerik
thank for writing dess,
then how to make subtotal for beverages and condiments before total price as the image attached.
If I understand your requirement correctly, you need to have the total for each master row calculating the value from all child rows associated with this parent row. You can add a summary item for the child template as well as it is demonstrated below:
GridViewSummaryItem summaryItem2 = new GridViewSummaryItem("UnitPrice", "Total price: {0}", GridAggregateFunction.Sum);GridViewSummaryRowItem summaryRowItem2 = new GridViewSummaryRowItem();summaryRowItem2.Add(summaryItem2);this.radGridView1.MasterTemplate.Templates[0].SummaryRowsTop.Add(summaryRowItem2);I hope this information helps.
Regards,
Dess | Tech Support Engineer, Sr.
Progress Telerik
Hi dess,
You understand it very well, i have implemented the codes but wrote in vb net, but still there is a problem sub total is always change when ever cell value in child rows changed, but grand total (total price at "Radgridview" mastertemplate) is not update the value until i click the cells.
Private Sub RadForm4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call KoneksiSQLServer()
Cmd = New SqlCommand("SelectBarangKegiatanHLast", Conn)
Cmd.CommandType = CommandType.StoredProcedure
Dim daBarangKegiatanH As SqlDataAdapter = New SqlDataAdapter(Cmd)
Cmd = New SqlCommand("SelectBarangKegiatanDLast", Conn)
Cmd.CommandType = CommandType.StoredProcedure
Dim daBarangKegiatanD As SqlDataAdapter = New SqlDataAdapter(Cmd)
Dim dsBrgKeg As DataSet = New DataSet("BarangKegiatan")
daBarangKegiatanH.FillSchema(dsBrgKeg, SchemaType.Source, "BarangKegiatanH")
daBarangKegiatanH.Fill(dsBrgKeg, "BarangKegiatanH")
daBarangKegiatanD.FillSchema(dsBrgKeg, SchemaType.Source, "BarangKegiatanD")
daBarangKegiatanD.Fill(dsBrgKeg, "BarangKegiatanD")
RadGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill
RadGridView1.DataSource = dsBrgKeg.Tables("BarangKegiatanH")
template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill
template.DataSource = dsBrgKeg.Tables("BarangKegiatanD")
RadGridView1.MasterTemplate.Templates.Add(template)
Dim relation As New GridViewRelation(RadGridView1.MasterTemplate)
relation.ChildTemplate = template
relation.RelationName = "BarangKegiatanHH"
relation.ParentColumnNames.Add("IdBrgKeg")
relation.ChildColumnNames.Add("IdBrgKegD")
RadGridView1.Relations.Add(relation)
Dim summaryItem As CustomSummaryItem = New CustomSummaryItem("Satuan", "Total harga: {0}", GridAggregateFunction.Count)
Dim summaryRowItem As GridViewSummaryRowItem = New GridViewSummaryRowItem()
summaryRowItem.Add(summaryItem)
Me.RadGridView1.SummaryRowsTop.Add(summaryRowItem)
Dim summaryItem2 As GridViewSummaryItem = New GridViewSummaryItem("HargaD", "Sub Total Harga: {0}", GridAggregateFunction.Sum)
Dim summaryRowItem2 As GridViewSummaryRowItem = New GridViewSummaryRowItem()
summaryRowItem2.Add(summaryItem2)
Me.RadGridView1.MasterTemplate.Templates(0).SummaryRowsTop.Add(summaryRowItem2)
End Sub
Public Class CustomSummaryItem
Inherits GridViewSummaryItem
Public Sub New(ByVal name As String, ByVal formatString As String, ByVal aggregate As GridAggregateFunction)
MyBase.New(name, formatString, aggregate)
End Sub
Public Overrides Function Evaluate(ByVal row As IHierarchicalRow) As Object
Dim total As Decimal = 0
For Each dataRow As GridViewRowInfo In row.ChildRows
For Each childRow As GridViewRowInfo In dataRow.ChildRows
total += CDec(childRow.Cells("HargaD").Value)
Next
Next
Return total
End Function
End Class
In order to force the custom summary item from the master level to be refreshed properly after modifying a child value, you can use the InvalidateRow method for the summary row as it is demonstrated below. The attached gif file illustrates the achieved behavior:
this.radGridView1.CellValueChanged+=radGridView1_CellValueChanged;private void radGridView1_CellValueChanged(object sender, GridViewCellEventArgs e){ if (e.Column.Name=="UnitPrice") { this.radGridView1.MasterView.SummaryRows[0].InvalidateRow(); }}I hope this information helps.
Regards,
Dess | Tech Support Engineer, Sr.
Progress Telerik
oke dess. thanks for your valueable reply.
Regards
