Create Custom Expression in Code
Environment
Product Version | Product | Author |
---|---|---|
2022.2.622 | RadGridView for WinForms | Dinko Krastev |
Description
This example demonstrates how we can create custom function programmatically. In the following example, we will demonstrate how to calculate the sum of all inventory per product by multiplying the Price and Quantity columns.
Solution
public partial class RadForm2 : Telerik.WinControls.UI.RadForm
{
public RadForm2()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Title", typeof(string));
//comment adding of the "Price" column in order to test the custom function
dt.Columns.Add("Price", typeof(decimal));
dt.Columns.Add("Quantity", typeof(int));
for (int i = 0; i < 10; i++)
{
dt.Rows.Add(i, "product" + i, i * 1.25, i);
}
this.radGridView1.DataSource = dt;
GridViewDecimalColumn col = new GridViewDecimalColumn("Calculated Column");
radGridView1.Columns.Add(col);
radGridView1.Columns["Calculated Column"].Expression = "CustomFunction(Id)";
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 CustomFunction(int id)
{
GridViewRowInfo currentRow = FindCurrentRowById(id);
if (currentRow != null)
{
int quantity = 0;
decimal price = 0;
if (grid.Columns.Contains("Price") && currentRow.Cells["Price"].Value != null)
{
decimal.TryParse(currentRow.Cells["Price"].Value.ToString(), out price);
}
if (grid.Columns.Contains("Quantity") && currentRow.Cells["Quantity"].Value != null)
{
int.TryParse(currentRow.Cells["Quantity"].Value.ToString(),
out quantity);
}
return (double)(quantity * price);
}
return 0;
}
private GridViewRowInfo FindCurrentRowById(int id)
{
foreach (GridViewRowInfo row in grid.Rows)
{
if ((int)row.Cells["Id"].Value == id)
{
return row;
}
}
return null;
}
}
Public Partial Class RadForm2
Inherits Telerik.WinControls.UI.RadForm
Public Sub New()
InitializeComponent()
Dim dt As DataTable = New DataTable()
dt.Columns.Add("Id", GetType(Integer))
dt.Columns.Add("Title", GetType(String))
dt.Columns.Add("Price", GetType(Decimal))
dt.Columns.Add("Quantity", GetType(Integer))
For i As Integer = 0 To 10 - 1
dt.Rows.Add(i, "product" & i, i * 1.25, i)
Next
Me.radGridView1.DataSource = dt
Dim col As GridViewDecimalColumn = New GridViewDecimalColumn("Calculated Column")
radGridView1.Columns.Add(col)
radGridView1.Columns("Calculated Column").Expression = "CustomFunction(Id)"
Telerik.Data.Expressions.ExpressionContext.Context = New CustomExpressionContext(radGridView1)
End Sub
End Class
Public Class CustomExpressionContext
Inherits Telerik.Data.Expressions.ExpressionContext
Private grid As RadGridView
Public Sub New(ByVal grid As RadGridView)
Me.grid = grid
End Sub
Public Function CustomFunction(ByVal id As Integer) As Double
Dim currentRow As GridViewRowInfo = FindCurrentRowById(id)
If currentRow IsNot Nothing Then
Dim quantity As Integer = 0
Dim price As Decimal = 0
If grid.Columns.Contains("Price") AndAlso currentRow.Cells("Price").Value IsNot Nothing Then
Decimal.TryParse(currentRow.Cells("Price").Value.ToString(), price)
End If
If grid.Columns.Contains("Quantity") AndAlso currentRow.Cells("Quantity").Value IsNot Nothing Then
Integer.TryParse(currentRow.Cells("Quantity").Value.ToString(), quantity)
End If
Return CDbl((quantity * price))
End If
Return 0
End Function
Private Function FindCurrentRowById(ByVal id As Integer) As GridViewRowInfo
For Each row As GridViewRowInfo In grid.Rows
If CInt(row.Cells("Id").Value) = id Then
Return row
End If
Next
Return Nothing
End Function
End Class