Drukowanie wielu stron: printPreview wyświetla prawidłowo, ale Print() drukuje tylko 1 pustą stronę

0

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.

1

Pierwszy problem sam rozwiązałem. Wynikał on ze złego zrozumienia metod i zdarzeń klasy Printing. Poniżej opiszę na czym polegał, być może komuś się ta wiedza przysłuży.
Jeżeli korzystamy z podglądu wydruku (tutaj: kontrolka printPreviewControl) to zdarzenie PrintPage zostaje wywołane odpowiednią do ilości stron ilość razy właśnie przy wyświetlaniu podglądu a następnie znowu tyle samo razy przy wywołaniu metody printDocument.Print(). Do tej pory myślałem, że raz wygenerowany dokument zostaje przekazany z podglądu do wydruku, ale tak nie jest, częściowym rozwiązaniem problemu było dodanie zdarzenia BeginPrint, w którym należy zresetować pola ktoraStrona, listTopOffset, listCountMax tak samo jak w konstruktorze formy. Ale wtedy pojawił się nowy problem związany z koniecznością odczytywania danych z DataReadera, który był już "zużyty". Tak więc dane z Readera trzeba było wpisać do jakiejś listy w konstruktorze, a następnie zmodyfikować pętlę pod koniec zdarzenia PrintPage, żeby odczytywała dane z tej listy, nie zaś z Readera.

W dalszym jednak ciągu nie udało mi się poprawić drobnej, lecz irytującej sprawy nieaktywnym z oknem PrintDialog.

1 użytkowników online, w tym zalogowanych: 0, gości: 1