Мне тоже удалось выяснить другой способ, который работал для меня ...
У меня был список классов MyPrintFileDetail, каждый из которых содержал PrintDocument и StreamReader для указанного документа.
При настройке моего PrintDocument я добавил событие PrintPage. В обработчике события PrintPage я определил, с каким PrintDocument я работал, путем приведения «отправителя» в PrintDocument. Затем написал цикл foreach для определения рабочего объекта MyPrintFileDetail из списка, чтобы получить StreamReader, который я использовал для печати. Когда больше не было строк для печати, я удалил StreamReader и установил его на нуль.
Затем в обратном вызове Timer для обработки списка объектов MyPrintFileDetail я проверил StreamReader на наличие нуля и, если он пуст, я закончил печать.
Вид неуклюжий, но это сработало.
private void PD_PrintPage(object sender, PrintPageEventArgs e)
{
PrintDocument p = (PrintDocument)sender;
PrintFileDetail pfdWorkingOn = null;
foreach (PrintFileDetail pfd in pfds)
{
if (pfd._PrintDoc.DocumentName == p.DocumentName)
{
pfdWorkingOn = pfd;
break;
}
}
float yPos = 0f;
int count = 0;
float leftMargin = e.MarginBounds.Left;
float topMargin = e.MarginBounds.Top;
string line = null;
float linesPerPage = e.MarginBounds.Height / _TextFilePrintingFont.GetHeight(e.Graphics);
while (count < linesPerPage)
{
line = pfdWorkingOn._TxtFileBeingPrinted.ReadLine();
if (line == null)
{
break;
}
yPos = topMargin + count * _TextFilePrintingFont.GetHeight(e.Graphics);
e.Graphics.DrawString(line, _TextFilePrintingFont, Brushes.Black, leftMargin, yPos, new StringFormat());
count++;
}
if (line != null)
{
e.HasMorePages = true;
}
else
{
pfdWorkingOn._TxtFileBeingPrinted.Dispose();
pfdWorkingOn._TxtFileBeingPrinted = null;
}
}