Диапазон печати не работает, даже если заданы значения

У меня настроено простое решение для печати, и нормальная печать работает нормально (проверил его пару раз), однако, когда я использую PrintDialog для указания пользовательского диапазона страниц, он как будто введен. Когда я выполняю отладку, я проверяю объект printDocument и подтверждаю, что значения диапазона верны, но конечный продукт, который производит принтер, не так сильно соответствует значениям, которые я ему дал.

Вот мой код:

            printDialog.Document = printdoc;
            printDialog.AllowSomePages = true;

            if (printDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                printdoc.PrinterSettings.FromPage = printDialog.PrinterSettings.FromPage;
                printdoc.PrinterSettings.ToPage = printDialog.PrinterSettings.ToPage;
                printdoc.PrinterSettings.PrintRange = printDialog.PrinterSettings.PrintRange;

                printPreviewDialog.Document = printdoc;
                printPreviewDialog.FindForm().WindowState = FormWindowState.Maximized;
                printPreviewDialog.ShowDialog();
            }

* Примечание - printdoc является экземпляром System.Drawing.Printing.PrintDocument. Я добавил код в обработчик события PrintPage для PrintDocument, чтобы заполнить страницу, которую я печатаю.

1 ответ

Решение

Вы должны сообщить диалоговому окну печати, что оно должно принимать пользовательский ввод для диапазонов страниц. Для этого вы можете указать PrinterSettings.PrintRange,

var printDialog = new PrintDialog();
printDialog.AllowSomePages = true; //May not be needed
printDialog.PrinterSettings.PrintRange = PrintRange.SomePages; //Needed
if(printDialog.ShowDialog() == DialogResult.OK)
{
    // ... do the rest here
}

Примечания: Главное, что вы должны получить, это то, что вам нужно установить PrintDialog.AllowSomePages = true (вместе с From/ToPage), чтобы указать диалогу печатать только эти диапазоны. Кроме того, я не уверен, если настройка AllowSomePages после закрытия диалога вступит в силу, поэтому я поставил код перед ShowDialog, Вы можете попытаться установить его внутри оператора if по вашему усмотрению.

Другие вопросы по тегам