Вы можете установить PrinterSettings в событии PrintDocument.BeginPrint.
Событие PrintDocument.PrintPage, в которое вы помещаете свой код печати, будет вызываться контроллером печати для каждой страницы до последней страницы, заданной в параметрах PrinterSettings. Например, если у вас есть 10-страничный PrintDocument и вы установили PrintDocument.PrinterSettings.ToPage = 5, тогда контроллер печати будет вызывать событие PrintPage для каждой страницы, пока не обработает 5-ю страницу.
Если вы пропускаете страницы, например PrinterSettings.FromPage = 3 до ToPage = 5, то контроллер печати вызовет событие PrintPage 3 раза. Это одно событие PrintPage на счет от 3 до 5 включительно.
Контроллер печати не решает, какой Контент будет напечатан событием PrintPage. Это вызывает событие только один раз для каждой просчитанной страницы в вашем диапазоне. Например, если вы укажете FromPage = 4 - FromPage = 6, контроллер печати вызовет точно такое же количество событий PrintPage, и он даже не узнает разницу! Он не знает, какую страницу он печатает с событием PrintPage. Он знает только, чтобы вызвать событие PrintPage 3 раза.
Суть в том, что ваш код в событии PrintPage должен обрабатывать все пропущенные страницы без рисования. Затем ваш код в том же самом событии PrintPage должен обработать и нарисовать «текущую страницу», которую вы хотите распечатать, а затем вернуться, чтобы контроллер печати мог вызвать следующее событие PrintPage.
Вот псевдокод:
void Setup_Printing()
{
myPrintDocument.BeginPrint += On_BeginPrint;
myPrintDocument.PrintPage += On_PrintPage;
}
// Page Index variable
int indexCuurentPage = 0;
void On_BeginPrint(object sender, PrintEventArgs e)
{
indexCuurentPage = 0;
((PrintDocument)sender).PrinterSettings.PrintRange = PrintRange.SomePages;
((PrintDocument)sender).PrinterSettings.FromPage = 3;
((PrintDocument)sender).PrinterSettings.ToPage = 5;
}
void On_PrintPage(object sender, PrintPageEventArgs ppea)
{
// Set up a loop to process pages.
bool bProcessingPages = true;
while (bProcessingPages)
{
indexCurrentPage++;
// Set isPageInRange flag to true if this indexCurrentPage is in the selected range of pages
bool isPageInRange = (theCurrentPage >= ppea.PageSettings.PrinterSettings.FromPage);
isPageInRange = isPageInRange && (theCurrentPage =< ppea.PageSettings.PrinterSettings.ToPage);
if (isPageInRange)
{
// Process your data and print this page then exit the loop.
try
{
//// TO DO - Process Data ////
//// TO DO - Draw Data to ppea.Graphics ////
// Note: Do not set the ppea.HasMorePages to true. Let the Printer Controller do it.
}
catch
{
// Abort printing more pages if there was an error.
ppea.HasMorePages = false;
}
// Set the loop exit flag. We could use "return;" instead if we do not want to do more.
bProcessingPages = false;
}
else
{
// Process your data and Do Not Draw on the ppea.Graphics.
try
{
//// TO DO - Process Data ////
}
catch
{
// Abort printing more pages if there was an error.
ppea.HasMorePages = false;
// Set the loop exit flag. We could use "return;" instead if we do not want to do more.
bProcessingPages = false;
}
// Stay in the processing loop until you either need to actually Print a Page
// or until you run out of data and pages to print.
}
// check to see if we ran out of pages to print
if (indexCurrentPage >= ppea.PageSettings.PrinterSettings.ToPage)
{
// Done. We do not need to set the HasMorePages = false
bProcessingPages = false;
}
} // end while processing pages
// The print controller will decide to raise the next PrintPage event if it needs to.
// If You set the ppea.HasMorePages = false, then it will stop any more page events.
// If You set the ppea.HasMorePages = true,
// then I'm not sure what the print controller will do if it ran out of pages!
}