Как напечатать все изображения PictureBoxes в FlowLayoutPanel - PullRequest
0 голосов
/ 16 марта 2020

Я изо всех сил пытаюсь напечатать все изображения PictureBox-es, которые размещены в контейнере FlowLayoutPanel.

Я пробовал этот код, но получаю исключение:

private void PrintAllImages()
{
    imagesToPrintCount = flowLayoutPanel1.Controls.Count;
    PrintDocument doc = new PrintDocument();
    doc.PrintPage += Document_PrintPage;
    PrintDialog dialog = new PrintDialog();
    dialog.Document = doc;

    if (dialog.ShowDialog() == DialogResult.OK)
        doc.Print();
}

private void Document_PrintPage(object sender, PrintPageEventArgs e)
{
    e.Graphics.DrawImage(GetNextImage(), e.MarginBounds);
    e.HasMorePages = imagesToPrintCount > 0;
}

private Image GetNextImage()
{
    //this line I get the error
    PictureBox pictureBox = (PictureBox)flowLayoutPanel2.Controls[flowLayoutPanel2.Controls.Count - imagesToPrintCount];

    imagesToPrintCount--;
    return pictureBox.Image;

}

Исключение:

System.ArgumentOutOfRangeException: 'Индекс -2 находится вне диапазона. Имя параметра: индекс '

1 Ответ

1 голос
/ 16 марта 2020

Вы можете упростить задачу, используя класс Queue .

  • Создать новый Queue<Image>.
  • Получить PictureBox-es из FlowLayoutPanel и ставят в очередь их изображения.
  • В событии PrintPage удаляют из очереди следующее изображение и рисуют его, пока очередь не станет пустой.

Я уменьшу ваш код методом PrintAllImages() следующим образом:

using System.Collections.Generic;
using System.Drawing.Printing;
//...

private void PrintAllImages()
{
    var queue = new Queue<Image>();

    flowLayoutPanel2.Controls.OfType<PictureBox>().Where(p => p.Image != null)
        .ToList().ForEach(p => queue.Enqueue(p.Image));

    if (queue.Count == 0) return;

    using (var doc = new PrintDocument())
    using (var pd = new PrintDialog())
    {
        pd.Document = doc;
        if(pd.ShowDialog() == DialogResult.OK)
        {
            doc.PrintPage += (s, e) =>
                {
                    e.Graphics.DrawImage(queue.Dequeue(), e.MarginBounds);
                    e.HasMorePages = queue.Count > 0;
                };
            pd.Document.Print();
        }
    }
}
//...
...