Progress® Telerik® Reporting R3 2020

How to Create Chart Programmatically

The steps below show how to create a minimal chart definition with the Graph item programmatically

The example below is an alternative to using the Report Designer for creating a chart. If applicable for your scenario our recommendation is to create your chart in the designer with Graph Wizard or manually as elaborated in the How to Create Chart Step by Step help article.


//Instantiate a new Graph
var graph1 = new Telerik.Reporting.Graph();
//The name property should be set for all report objects!
graph1.Name = "graph1";
//Set the desired graph size
graph1.Size = new Telerik.Reporting.Drawing.SizeU(Telerik.Reporting.Drawing.Unit.Cm(13), 
//Set the desired graph location.
//We place the graph item in the parent container's top left corner.
graph1.Location = new Telerik.Reporting.Drawing.PointU(Telerik.Reporting.Drawing.Unit.Cm(0), Telerik.Reporting.Drawing.Unit.Cm(0));
//Add the graph item in parent container.
//We add the graph item in the report's detail section.

//Setup the SqlDataSource
var sqlDataSource1 = new Telerik.Reporting.SqlDataSource();
sqlDataSource1.ConnectionString = "Telerik.Reporting.Examples.CSharp.Properties.Settings.TelerikConnectionString";
sqlDataSource1.Name = "sqlDataSource1";
sqlDataSource1.SelectCommand = "SELECT SOD.LineTotal, SOH.OrderDate, PC.Name AS ProductCategory FROM Sales.SalesOrderHeader " +
    "AS SOH INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product " +
    "AS P ON SOD.ProductID = P.ProductID INNER JOIN Production.ProductSubcategory AS PS ON P.ProductSubcategoryID = " +
    "PS.ProductSubcategoryID INNER JOIN Production.ProductCategory AS PC ON PS.ProductCategoryID = PC.ProductCategoryID ";
//Set the DataSource property to the new SqlDataSource component.
graph1.DataSource = sqlDataSource1;

//Create the category group.
//The CategoryGroups hierarchy defines the data points in the Graph series. 
var productCategoryGroup = new Telerik.Reporting.GraphGroup();
productCategoryGroup.Name = "categoryGroup1";
//Add a new grouping to the graph group.
//In this case you have a group by product categories in the CategoryGroups hierarchy.
//The number of different categories will determine how many data points the series will have at runtime. 
//If the product categories consist of 'Accessories', 'Bikes', 'Components' and 'Clothing' categories, 
//the series in the Graph will have four data points. 
productCategoryGroup.Groupings.Add(new Telerik.Reporting.Grouping("=Fields.ProductCategory"));
productCategoryGroup.Sortings.Add(new Telerik.Reporting.Sorting("=Fields.ProductCategory", Telerik.Reporting.SortDirection.Asc));

//The SeriesGroups hierarchy defines the series at runtime. 
var orderDateGroup = new Telerik.Reporting.GraphGroup();
orderDateGroup.Name = "seriesGroup1";
//Add a new grouping to the Graph group.
//In this case you have a group by the Year field in the SeriesGroups hierarchy. 
//The number of different years will determine how many series will appear on the Graph. 
//If the Year field contains the years 2001, 2002, 2003, and 2004, 
//the Graph will display four series for every series definition bound to this group. 
orderDateGroup.Groupings.Add(new Telerik.Reporting.Grouping("=Fields.OrderDate.Year"));
orderDateGroup.Sortings.Add(new Telerik.Reporting.Sorting("=Fields.OrderDate.Year", Telerik.Reporting.SortDirection.Asc));

//Setup Graph Axis with CategoryScale.
//The Axis represents a single dimension of the coordinate system.
var graphAxisCategoryScale = new Telerik.Reporting.GraphAxis();
graphAxisCategoryScale.Name = "GraphAxis1";
//The Scale defines how the data is projected on the axis;
//The CategoryScale represents an ordinal scale with discrete domain like names and categories.
graphAxisCategoryScale.Scale = new Telerik.Reporting.CategoryScale();

//Setup Graph axis with NumericalScale.
var graphAxisNumericScale = new Telerik.Reporting.GraphAxis();
graphAxisNumericScale.Name = "GraphAxis2";
//The numerical scale represents a scale with continuous domain of numbers: 
//integer numbers (Int16, Int32, Int64) or floating point numbers (Single, Double), etc;
graphAxisNumericScale.Scale = new Telerik.Reporting.NumericalScale();

//The Graph item uses a two-dimensional coordinate system that uniquely identifies the position of each data point. 
//Each coordinate system consists of two axes(reference lines) and an origin. 
var cartesianCoordinateSystem1 = new Telerik.Reporting.CartesianCoordinateSystem();
cartesianCoordinateSystem1.Name = "cartesianCoordinateSystem1";
cartesianCoordinateSystem1.XAxis = graphAxisCategoryScale;
cartesianCoordinateSystem1.YAxis = graphAxisNumericScale;

//The Graph Series are series of data points that represents individual measurements.
//At runtime the intersection between the series group hierarchy members 
//and the category group hierarchy members defines the data points in the series.
//For each data point one or more aggregate functions are calculated to define 
//the value/coordinates of the data points.
var barSeries1 = new Telerik.Reporting.BarSeries();
barSeries1.CategoryGroup = productCategoryGroup;
barSeries1.CoordinateSystem = cartesianCoordinateSystem1;
barSeries1.LegendItem.Value = "= Fields.OrderDate.Year";
barSeries1.SeriesGroup = orderDateGroup;
barSeries1.Y = "=IsNull(Sum(Fields.LineTotal), 0) / 1000.0";

In this article
Not finding the help you need?