HKHerron Ответов: 1

Как использовать объект printdocument и предварительный просмотр для печати многостраничного отчета


Существует масса решений о том, как обрабатывать печать нескольких страниц, когда не хватает места для печати на одной странице. Однако я не могу найти решение, где можно распечатать многостраничный отчет с предварительным просмотром печати. Дело не в том, что моя информация не подходит, она идеально подходит, поскольку я использую один и тот же код для печати одной страницы. Только без цикла For-Next.

Может ли кто-нибудь показать мне, как использовать предварительный просмотр печати с многостраничным отчетом? Каждая страница точно такая же, просто на ней другая информация.

Что я уже пробовал:

Вот мой код:

void printButton_Click(object sender, EventArgs e)
        {
            printDocument1.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(500, 500, 500, 500);
            printDialogPreview.Document = printDocument1;
            printDialogPreview.Document.DocumentName = MainForm._fileName;
            if (printDialogPreview.ShowDialog() == DialogResult.OK)
            {
                //printDocument1.PrinterSettings = printDialogPreview.PrinterSettings;
                printDocument1.Print();
            }
        }

        private void CapturePrintPanel(Control pnl)
        {
            Graphics myGraphics = pnl.CreateGraphics();
            memoryImage = new Bitmap(pnl.Width, pnl.Height);
            Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
            pnl.DrawToBitmap(memoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
        }

        private void printDocument1_PrintPage(System.Object sender,
               System.Drawing.Printing.PrintPageEventArgs e)
        {
            for (int i = 0; i < Readings.Count; i++)
            {
                pP = new PrintPreview(Readings[i]);
                pP.Show();
                CapturePrintPanel(pP.Controls["printPanel"]);
                e.Graphics.DrawImage(memoryImage, 0, 0);
                pP.Close();
                pP.Dispose();
                if((i + 1) < Readings.Count)
                {
                    e.HasMorePages = i < Readings.Count;
                }
            }
            e.HasMorePages = false;
        }

1 Ответов

Рейтинг:
1

OriginalGriff

Когда вы используете PrintDocument, он вызывает событие PrintPage и передает PrintPageEventArgs, который предоставляет информацию о том, как печатать, включая графический объект, на котором вы должны печатать. Когда вы используете PrintPreview, контекст предназначен для отображения, а для принтера-это фактическая "поверхность печати", которая будет отображаться на бумаге (или PDF, или что-то еще).
Одним из свойств EventArgs является свойство HasMorePages, которое при значении true приведет к печати другой страницы после завершения первой.

Каждый раз, когда вызывается PrintPage, вы печатаете только информацию об этой странице и сохраняете информацию на уровне класса для следующей страницы. Так что вы бы использовали то же самое for цикл, но вместо того, чтобы начинать с "нулевой строки" и печатать до конца, вы печатаете строку 0-24 на первой странице, устанавливаете свойство HasMorePages в true, затем печатаете строки 25-49 на второй странице - затем устанавливаете HasMorePages в false, если больше нет страниц для отображения.

Попробуйте просто напечатать 3 страницы с большой буквой "1", "2" или "3" посередине - вы получите эту идею довольно скоро!