Use the following code snippet: public Form1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Item", typeof(string)); dt.Columns.Add("Price", typeof(decimal)); for (int i = 0; i < 10; i++) { dt.Rows.Add(i % 5, "Item" + i, i * 2.25m); } this.radGridView1.DataSource = dt; GridViewDecimalColumn customCalculatedCol = new GridViewDecimalColumn("Custom Calculated Column"); customCalculatedCol.Name = "Custom Calculated Column"; customCalculatedCol.Expression = "SumIf(Id)"; radGridView1.Columns.Add(customCalculatedCol); GridViewDecimalColumn customCalculatedCola = new GridViewDecimalColumn("Custom Col_A"); radGridView1.Columns.Add(customCalculatedCola); this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; Telerik.Data.Expressions.ExpressionContext.Context = new CustomExpressionContext(radGridView1); } public class CustomExpressionContext : Telerik.Data.Expressions.ExpressionContext { private RadGridView grid; public CustomExpressionContext(RadGridView grid) { this.grid = grid; } public double SumIf(int currentId) { double countIf = 0; decimal sumIf = 0; foreach (GridViewRowInfo r in this.grid.Rows) { if ((int)r.Cells["Id"].Value == currentId) { countIf++; sumIf += (decimal)r.Cells["Price"].Value; } } return (double)sumIf; } } Workaround: invalidate the affected rows manually private void radGridView1_CellValueChanged(object sender, GridViewCellEventArgs e) { if (e.Column.Name == "Price" || e.Column.Name == "Id") { foreach (GridViewRowInfo r in this.radGridView1.Rows) { if ((int)r.Cells["Id"].Value == (int)e.Row.Cells["Id"].Value) { r.InvalidateRow(); } } } }