Problem jest następujący:
Forma zawiera jedynie kontrolkę printPreviewControl oraz przycisk "Drukuj" (na kontrolce toolStrip). PrintPreviewControl prawidłowo wyświetla wygenerowany dokument, który zawiera kilka stron. Niestety po kliknięciu "Drukuj", zatwierdzeniu okna printDialog i wywołaniu metody printDocument.Print() do drukarki wysłany zostaje dokument zawierający 1 stronę, rozmiar: 9.12kB, po wydrukowaniu okazuje się, że jest to pojedyncza pusta strona (sprawdzane na kilku drukarkach). W tym samym programie w innym miejscu wykorzystuję identyczną formę do drukowania pojedynczych stron z inną treścią - tam drukowanie przebiega prawidłowo.
Drugi, mniej znaczący, problem to fakt, że potwierdzenie drukowania w oknie printDialog (czyli naciśnięcie przycisku "Drukuj") zamyka okno (i w efekcie uruchamia proces drukowania) dopiero przy drugim kliknięciu, tak, jakby okno uruchamiane było jako nieaktywne.
Drukowane strony wyglądają następująco:
Większa część pierwszej strony jest nagłówkowa, jej pozostała część + wszystkie kolejne strony (już bez nagłówków) to zwykła numerowana lista wypisywana kolejno z bazy danych.
public partial class StatystykaDrukowanie : Form
{
CytologiaWindow cyto;
int ktoraStrona;
int listTopOffset, listCountMax;
cytologiaDataSet.pacjenciWidokDataTable pacjenci;
public StatystykaDrukowanie(CytologiaWindow cyto_, cytologiaDataSet.pacjenciWidokDataTable pacjenci_)
{
this.cyto = cyto_;
this.pacjenci = pacjenci_;
InitializeComponent();
PaperSize paperSize = new PaperSize("A5", 582, 826);
printDocument.DefaultPageSettings.PaperSize = paperSize;
this.ktoraStrona = 0;
this.listTopOffset = 430;
this.listCountMax = 28;
}
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
e.HasMorePages = true;
StringFormat formatCenter = new StringFormat();
StringFormat formatRight = new StringFormat();
formatCenter.Alignment = StringAlignment.Center;
formatRight.Alignment = StringAlignment.Far;
Graphics g = e.Graphics;
if (this.ktoraStrona == 0)
{
// tutaj jest całe formatowanie pierwszej strony, rysowanie danych z bazy z wykorzystaniem g.DrawString()
}
else
{
this.listCountMax = 64;
this.listTopOffset = 15;
}
// poniżej jest wypisywanie listy z danymi
using (Font font = new Font("Arial", 8))
{
int ii;
cytologiaDataSet.pacjenciWidokRow pacjent;
for(int i = 1; i<=this.listCountMax; i++)
{
if (!this.cyto.rdr_.Read())
{
e.HasMorePages = false;
break;
}
ii = this.ktoraStrona == 0 ? i : 28 + (this.ktoraStrona - 1) * 64 + i;
pacjent = pacjenci.FindByIdPacjenta(cyto.rdr_.GetInt32(0));
g.DrawString(ii + ". " + pacjent.Imie+" "+pacjent.Nazwisko+", PESEL: "+pacjent.PESEL, font, Brushes.Black, 15, this.listTopOffset + i * 12);
}
}
this.ktoraStrona++;
this.previewControl.Rows = this.ktoraStrona;
}
private void drukujButton_Click(object sender, EventArgs e)
{
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDialog.Document = printDocument;
//printDocument.PrintController = new StandardPrintController();
printDocument.Print();
}
printDocument.Dispose();
this.Dispose();
}
}
Jeżeli będzie taka potrzeba, mogę też wrzucić kod pliku, w którym rysowane i ustawiane są kontrolki w formie. Zapewniam, że event _printPage jest dodany do handlera i wszystkie właściwości "document" ustawione na właściwy obiekt.
Z góry dziękuję za pomoc.