Printing a readable chart could be a tricky task, especially, while printing charts with large data. Depending on the use case and requirement, there can be multiple ways in which a chart can be printed. For instance, printing a chart on a single page is a good idea when chart has less data or you want to understand the overall pattern of data without knowing the detailed data points. On the other hand, when you want to study chart details, you can display one chart on each page or even a single chart divided into sub-charts or strip charts on multiple pages.

In FlexChart, you can carry out printing by using the C1.Chart.FlexChart.Printing assembly that can be obtained by building the product sample named C1.Chart.FlexChart.Printing and accessing obj\Debug folder inside the project. This assembly provides the ChartPrinter class to achieve printing in FlexChart. The sections below discuss how this class can be used in various printing scenarios.
Note: C1.Chart.FlexChart.Printing sample is located at \Documents\ComponentOne Samples\WinForms\v4.5.2\C1FlexChart\CS\FlexChartPrint on your system, if you have installed the samples while installing WinForms Edition using ComponentOneC1ControlPanel.exe.
Single Page Printing
In FlexChart, you can print a chart on a single page by creating an instance of the above-mentioned ChartPrinter class. The constructor takes two parameters, one is the target FlexChart instance and other one is a Boolean value that indicates whether to display the print dialog or not. You, then need to specify whether you need to scale the chart for printing by using the PrintScale enumeration which lets you set the chart scaling to none, fit, stretch and zoom according to the available space. You can also opt to set the custom page and printer settings, grayscale etc. as per the requirement and then call the PrintCtrl method which accepts PrintScale and some of the settings as its parameters.
private void btnPrint_Click(object sender, EventArgs e)
{
//create Printer FlexChart
ChartPrinter chartPrinter = new ChartPrinter(flexChart1, true);
//set settings for page
if (PageSettngs == null)
PageSettngs = new PageSettings() { Landscape = true };
//replace default page settings with custom page settings
chartPrinter.PageSettingsProp = PageSettngs;
//replace default printer settings with custom printer settings, if any
if (PrinterSettngs != null)
{
chartPrinter.PrintSettingsProp = PrinterSettngs;
}
//set whether or not to resize FlexChart according to the print rectangle
ChartPrinter.PrintScale pscale =
(ChartPrinter.PrintScale)Enum.Parse(typeof(ChartPrinter.PrintScale), "None");
//set whether to print in GrayScale or not
chartPrinter.UseGrayScale = false;
bool usePrintPreview = true;
bool printAsBitmap = false;
//print FlexChart with specific printer and page settings
chartPrinter.PrintCtrl(pscale, new Rectangle(100,200,400,400), PageSettngs, printAsBitmap, usePrintPreview);
}
Private Sub btnPrint_Click(sender As Object, e As EventArgs)
'create Printer FlexChart
Dim chartPrinter As New ChartPrinter(flexChart1, True)
'set settings for page
If PageSettngs Is Nothing Then
PageSettngs = New PageSettings() With {
.Landscape = True
}
End If
'replace default page settings with custom page settings
chartPrinter.PageSettingsProp = PageSettngs
' replace default printer settings with custom printer settings, if any
If PrinterSettngs IsNot Nothing Then
chartPrinter.PrintSettingsProp = PrinterSettngs
End If
'set whether or not to resize FlexChart according to the print rectangle
Dim pscale As ChartPrinter.PrintScale = CType([Enum].Parse(GetType(ChartPrinter.PrintScale), "None"), ChartPrinter.PrintScale)
'set whether to print in GrayScale or not
chartPrinter.UseGrayScale = False
Dim usePrintPreview As Boolean = True
Dim printAsBitmap As Boolean = False
'print FlexChart with specific printer and page settings
chartPrinter.PrintCtrl(pscale, New Rectangle(100, 200, 400, 400), PageSettngs, printAsBitmap, usePrintPreview)
End Sub
Multi-page Printing
There can be various scenarios in which a chart or charts are required to be printed on multiple pages. To achieve the multi-page printing, we need to use the above-mentioned ChartPrinter class in conjunction with the PrintDocument class. The PrintDocument class, along with the settings related to the print, provides the PrintPage event which is required to implement the main printing job. You can use PrinterCtrlToPage method of the ChartPrinter class, DrawChart method of the FlexChart class or DrawImage method of the Graphics class as per the layout requirements. In this example, we have demonstrated how to print a single chart on multiple pages in the form of sub-charts.

private void btnSubCharts_Click(object sender, EventArgs e)
{
if (PageSettngs == null)
PageSettngs = new PageSettings { Landscape = true };
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings = PageSettngs;
pd.PrinterSettings = PrinterSettngs;
int pageNumber = 0;
// determine the limits over which the chart should be printed.
int pageCount = 4;
double minXValue = 0;
double maxXValue = ShowAxisY.AxisX.ActualMax;
double increment = (maxXValue - minXValue) / pageCount;
double minFlex = double.NaN, maxFlex = double.NaN;
double minFlexY = double.NaN, maxFlexY = double.NaN;
int bitmapLeft = 0;
pd.BeginPrint += (pageSender, beginPrintEventArgs) =>
{
if(ShowAxis)
{
// save the current axis limits
minFlex = ShowAxisY.AxisX.Min;
maxFlex = ShowAxisY.AxisX.Max;
minFlexY = ShowAxisY.AxisY.Min;
maxFlexY = ShowAxisY.AxisY.Max;
ShowAxisY.AxisX.Min = minXValue;
ShowAxisY.AxisX.Max = increment;
ShowAxisY.AxisY.Min = ShowAxisY.AxisY.ActualMin;
ShowAxisY.AxisY.Max = ShowAxisY.AxisY.ActualMax;
}
else
{
bitmapLeft = 0;
}
pageNumber = 0;
};
pd.PrintPage += (pageSender, printPageEventArgs) =>
{
pageNumber++;
if (ShowAxis)
{
// Each chart or page could use a different FlexChart instance, but in this case
// subsets of a single FlexChart instance is used.
ChartPrinter chartPrinter = new ChartPrinter(ShowAxisY, true);
// The chart is drawn within the rectangle assuming coordinates relative
// to the Top-Left page margin as specified in the prinPageEventArgs.
// An empty rectangle indicates a full page rather than a limited
// rectangle on the page.
Rectangle rect = new Rectangle(0, 0, 0, 0);
printPageEventArgs.HasMorePages = pageNumber < 30; // sanity check to avoid endless loop.
chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Fit, rect, false);
}
else
{
int pageWidth = PageSettngs.Bounds.Width - PageSettngs.Margins.Left - PageSettngs.Margins.Right;
int pageHeight = PageSettngs.Bounds.Height - PageSettngs.Margins.Top - PageSettngs.Margins.Bottom;
int bitMapWidth = pageCount * pageWidth;
int bitMapHeight = pageHeight;
int incremnt = bitMapWidth / pageCount;
Bitmap bitmap = new Bitmap(bitMapWidth, bitMapHeight);
using (Graphics gr = Graphics.FromImage(bitmap))
{
this.ShowAxisY.DrawChart(gr, new Size(bitMapWidth, bitMapHeight));
}
Graphics g = printPageEventArgs.Graphics;
g.DrawImage(bitmap,
new Rectangle(PageSettngs.Margins.Left, PageSettngs.Margins.Top, incremnt, bitMapHeight),
new Rectangle(bitmapLeft, 0, incremnt, bitMapHeight),
GraphicsUnit.Pixel);
bitmapLeft += incremnt;
}
if(ShowAxis)
{
bool morePages = ShowAxisY.AxisX.Max < maxXValue;
printPageEventArgs.HasMorePages = morePages;
if (morePages)
{
// set up for the next page.
ShowAxisY.AxisX.Min += increment;
ShowAxisY.AxisX.Max += increment;
}
}
else
{
bool morepages = pageNumber < 8;
printPageEventArgs.HasMorePages = morepages;
}
};
pd.EndPrint += (pageSender, endPrintEventArgs) =>
{
if(ShowAxis)
{
// restore the axis limits
ShowAxisY.AxisX.Max = maxFlex;
ShowAxisY.AxisX.Min = minFlex;
ShowAxisY.AxisY.Max = maxFlexY;
ShowAxisY.AxisY.Min = minFlexY;
}
else
{
bitmapLeft = 0;
}
// reset for next print from preview dialog.
pageNumber = 0;
};
ChartPrinter.ChartPreviewDialogEx(pd, true);
pd.Dispose();
}
Private Sub btnSubCharts_Click(sender As Object, e As EventArgs)
If PageSettngs Is Nothing Then
PageSettngs = New PageSettings() With {
.Landscape = True
}
End If
Dim pd As New PrintDocument()
pd.DefaultPageSettings = PageSettngs
pd.PrinterSettings = PrinterSettngs
Dim pageNumber As Integer = 0
' determine the limits over which the chart should be printed.
Dim pageCount As Integer = 8
Dim minXValue As Double = 0
Dim maxXValue As Double = ShowAxisY.AxisX.ActualMax
Dim increment As Double = (maxXValue - minXValue) / pageCount
Dim minFlex As Double = Double.NaN, maxFlex As Double = Double.NaN
Dim minFlexY As Double = Double.NaN, maxFlexY As Double = Double.NaN
Dim bitmapLeft As Integer = 0
AddHandler pd.BeginPrint, Sub()
If ShowAxis Then
' save the current axis limits
minFlex = ShowAxisY.AxisX.Min
maxFlex = ShowAxisY.AxisX.Max
minFlexY = ShowAxisY.AxisY.Min
maxFlexY = ShowAxisY.AxisY.Max
ShowAxisY.AxisX.Min = minXValue
ShowAxisY.AxisX.Max = increment
ShowAxisY.AxisY.Min = ShowAxisY.AxisY.ActualMin
ShowAxisY.AxisY.Max = ShowAxisY.AxisY.ActualMax
Else
bitmapLeft = 0
End If
pageNumber = 0
End Sub
AddHandler pd.PrintPage, Sub(pageSender, printPageEventArgs)
pageNumber += 1
If ShowAxis Then
' Each chart or page could use a different FlexChart instance, but in this case
' subsets of a single FlexChart instance is used.
Dim chartPrinter__1 As New ChartPrinter(ShowAxisY, True)
' The chart is drawn within the rectangle assuming coordinates relative
' to the Top-Left page margin as specified in the prinPageEventArgs.
' An empty rectangle indicates a full page rather than a limited
' rectangle on the page.
Dim rect As New Rectangle(0, 0, 0, 0)
printPageEventArgs.HasMorePages = pageNumber < 30
' sanity check to avoid endless loop.
chartPrinter__1.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Fit, rect, False)
Else
Dim pageWidth As Integer = PageSettngs.Bounds.Width - PageSettngs.Margins.Left - PageSettngs.Margins.Right
Dim pageHeight As Integer = PageSettngs.Bounds.Height - PageSettngs.Margins.Top - PageSettngs.Margins.Bottom
Dim bitMapWidth As Integer = pageCount * pageWidth
Dim bitMapHeight As Integer = pageHeight
Dim incremnt As Integer = bitMapWidth \ pageCount
Dim bitmap As New Bitmap(bitMapWidth, bitMapHeight)
Using gr As Graphics = Graphics.FromImage(bitmap)
Me.ShowAxisY.DrawChart(gr, New Size(bitMapWidth, bitMapHeight))
End Using
Dim g As Graphics = printPageEventArgs.Graphics
g.DrawImage(bitmap, New Rectangle(PageSettngs.Margins.Left, PageSettngs.Margins.Top, incremnt, bitMapHeight), New Rectangle(bitmapLeft, 0, incremnt, bitMapHeight), GraphicsUnit.Pixel)
bitmapLeft += incremnt
End If
If ShowAxis Then
Dim morePages__2 As Boolean = ShowAxisY.AxisX.Max < maxXValue
printPageEventArgs.HasMorePages = morePages__2
If morePages__2 Then
' set up for the next page.
ShowAxisY.AxisX.Min += increment
ShowAxisY.AxisX.Max += increment
End If
Else
Dim morepages__3 As Boolean = pageNumber < 8
printPageEventArgs.HasMorePages = morepages__3
End If
End Sub
AddHandler pd.EndPrint, Sub()
If ShowAxis Then
' restore the axis limits
ShowAxisY.AxisX.Max = maxFlex
ShowAxisY.AxisX.Min = minFlex
ShowAxisY.AxisY.Max = maxFlexY
ShowAxisY.AxisY.Min = minFlexY
Else
bitmapLeft = 0
End If
' reset for next print from preview dialog.
pageNumber = 0
End Sub
ChartPrinter.ChartPreviewDialogEx(pd, True)
pd.Dispose()
End Sub
For more printing scenarios and detailed implementation, see FlexChartExplorer sample which is shipped with the control. To see this feature in action, you can also download the FlexChartExplorer demo from our website.