private void MultiChartPageClick(bool singlePage)
        {
            InitializePageSettings();

            PrintDocument pd = new PrintDocument();

            pd.DefaultPageSettings = BaseSample.pageSets;

            if (BaseSample.prnSets != null)
            {
                pd.PrinterSettings = BaseSample.prnSets;
            }

            int pageNumber = 0;

            pd.PrintPage += (pageSender, printPageEventArgs) =>
            {
                FlexChart flexChart = BaseSample.FlexChart;

                // Each chart or page could use a different FlexChart instance, but for simplicity
                // of the sample, a single FlexChart instance is used with minor changes to differentiate them.
                ChartPrinter chartPrinter = new ChartPrinter(flexChart, true);

                // Save changes to the FlexChart instance so they can be restored later.
                Color  originalBackgroundColor = flexChart.BackColor;
                string title = flexChart.Header.Content;

                pageNumber++;

                // the chart is drawn within the rectangle assuming coordinates relative
                // to the Top-Left page margin as specifiec in the prinPageEventArgs.
                Rectangle rect = singlePage ? new Rectangle(0, 100, 400, 200) : Rectangle.Empty;

                printPageEventArgs.HasMorePages = pageNumber < 4;       // sanity check to avoid endless loop.

                // Print the chart 4 times with different modified charts.
                if (singlePage || (!singlePage && pageNumber == 1))
                {
                    flexChart.BackColor      = Color.Yellow;
                    flexChart.Header.Content = "Fit With Yellow Background";
                    chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Fit, rect, false);
                    drawMarginedRectangle(printPageEventArgs.Graphics, rect, printPageEventArgs.MarginBounds);
                }

                // same chart with GrayScale next to it.
                if (singlePage || (!singlePage && pageNumber == 2))
                {
                    if (singlePage)
                    {
                        rect.X += rect.Width + 50;
                    }
                    flexChart.Header.Content = "Fit With Yellow Background in GrayScale";
                    chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Fit, rect, true);
                    drawMarginedRectangle(printPageEventArgs.Graphics, rect, printPageEventArgs.MarginBounds);
                }

                if (singlePage || (!singlePage && pageNumber == 3))
                {
                    if (singlePage)
                    {
                        rect.X -= rect.Width + 50; rect.Y += rect.Height + 50;
                    }
                    flexChart.BackColor      = Color.Green;
                    flexChart.Header.Content = "Zoomed With Green Background";
                    chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Zoom, rect, false);
                    drawMarginedRectangle(printPageEventArgs.Graphics, rect, printPageEventArgs.MarginBounds);
                }


                if (singlePage || (!singlePage && pageNumber == 4))
                {
                    if (singlePage)
                    {
                        rect.X += rect.Width + 50;
                    }
                    flexChart.BackColor      = Color.MistyRose;
                    flexChart.Header.Content = "Stretched With Rose Background";
                    chartPrinter.PrinterCtrlToPage(pd, printPageEventArgs, ChartPrinter.PrintScale.Stretch, rect, false);
                    drawMarginedRectangle(printPageEventArgs.Graphics, rect, printPageEventArgs.MarginBounds);
                    printPageEventArgs.HasMorePages = false;
                    pageNumber = 0;     // zero for the next print from preview dialog.
                }

                // restore modified chart setting to original values.
                flexChart.Header.Content = title;
                flexChart.BackColor      = originalBackgroundColor;
            };

            ChartPrinter.ChartPreviewDialogEx(pd, BaseSample.prnSets == null);

            pd.Dispose();
        }
        private void btnSubCharts_Click(object sender, EventArgs e)
        {
            FlexChart flexChart = BaseSample.FlexChart;

            InitializePageSettings();

            PrintDocument pd = new PrintDocument();

            pd.DefaultPageSettings = BaseSample.pageSets;
            pd.PrinterSettings     = BaseSample.prnSets;

            int pageNumber = 0;

            // determine the limits over which the chart should be printed.
            int    pageCount = 8;
            double minXValue = 0;
            double maxXValue = BaseSample.maximumXValue;

            double increment = (maxXValue - minXValue) / pageCount;

            double minFlex = double.NaN, maxFlex = double.NaN;
            double minFlexY = double.NaN, maxFlexY = double.NaN;

            pd.BeginPrint += (pageSender, beginPrintEventArgs) =>
            {
                // save the current axis limits
                minFlex  = flexChart.AxisX.Min;
                maxFlex  = flexChart.AxisX.Max;
                minFlexY = flexChart.AxisY.Min;
                maxFlexY = flexChart.AxisY.Max;

                flexChart.AxisX.Min = minXValue;
                flexChart.AxisX.Max = increment;
                flexChart.AxisY.Min = flexChart.AxisY.ActualMin;
                flexChart.AxisY.Max = flexChart.AxisY.ActualMax;

                pageNumber = 0;
            };


            pd.PrintPage += (pageSender, printPageEventArgs) =>
            {
                // 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(flexChart, true);
                pageNumber++;

                // The chart is drawn within the rectangle assuming coordinates relative
                // to the Top-Left page margin as specifiec 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);

                bool morePages = flexChart.AxisX.Max < maxXValue;
                printPageEventArgs.HasMorePages = morePages;

                if (morePages)
                {
                    // set up for the next page.
                    flexChart.AxisX.Min += increment;
                    flexChart.AxisX.Max += increment;
                }
            };

            pd.EndPrint += (pageSender, endPrintEventArgs) =>
            {
                // restore the axis limits
                flexChart.AxisX.Max = maxFlex;
                flexChart.AxisX.Min = minFlex;
                flexChart.AxisY.Max = maxFlexY;
                flexChart.AxisY.Min = minFlexY;

                // reset for next print from preview dialog.
                pageNumber = 0;
            };

            ChartPrinter.ChartPreviewDialogEx(pd, true);
            pd.Dispose();
        }