Print Preview mit initial mehreren Seiten

    • C#
    • .NET (FX) 4.0

      Print Preview mit initial mehreren Seiten

      Hallo Leute,
      es ärgerte mich, dass ich bei einem zweiseitigen Ausdruck initial immer nur die erste Seite angezeigt bekam.
      So hab ich mal rumgehorcht und kann Euch folgenden Code präsentieren, bei dem der PrintPreviewDialog (in Grenzen) beliebig voreingestellt werden kann.
      Bekannt ist, dass im PrintPreviewDialog oben Buttons hat, die die Anzahl der dargestellten Seiten vorgeben:

      Diese werden vom PrintPreviewControl benutzt und die Anzeige wird entsprechend angepasst.
      Da dieses PrintPreviewControl eine Property vom PrintPreviewDialog ist, haben wir hier den Zugang gefunden, unser Vorhaben zu realisieren.

      1. Einfache Lösung bei bekannter Anzahl von Druckseiten:

      C#-Quellcode

      1. using (PrintPreviewDialog dlg = new PrintPreviewDialog())
      2. {
      3. dlg.Document = this.printDocument1;
      4. dlg.PrintPreviewControl.Columns = 2;
      5. dlg.PrintPreviewControl.Rows = 1; // default
      6. dlg.ShowDialog();
      7. }

      2. Dynamische Lösung bei beliebiger Seitenanzahl:
      Interessant wird es, wenn wir initial nicht wissen, wieviele Seiten ausgedruckt werden.
      Da wir in diesem Falle auf die PrintPreviewDialog-Instanz zugreifen müssen, können wir sie nicht in einem using-Block verwenden.
      Die Anzahl der Druckseiten geben wir mit einem NumericUpDown-Control vor.
      Dazu legen wir eine Instanz in die Klasse und updaten das PrintPreviewControl im PrintPage-Event:
      Spoiler anzeigen

      C#-Quellcode

      1. private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
      2. {
      3. this.nb++; // Seitennummer
      4. // ausgeben
      5. e.Graphics.DrawString(this.nb.ToString(), new Font("Arial", 200), Brushes.Black, new PointF(20, 20));
      6. // letzte Seite erkennen
      7. e.HasMorePages = (nb < this.numericUpDown1.Value);
      8. // PrintPreviewControl updaten
      9. switch (this.nb)
      10. {
      11. case 1:
      12. this.dialog.PrintPreviewControl.Columns = 1;
      13. this.dialog.PrintPreviewControl.Rows = 1;
      14. break;
      15. case 2:
      16. this.dialog.PrintPreviewControl.Columns = 2;
      17. this.dialog.PrintPreviewControl.Rows = 1;
      18. break;
      19. case 3:
      20. this.dialog.PrintPreviewControl.Columns = 3;
      21. this.dialog.PrintPreviewControl.Rows = 1;
      22. break;
      23. case 4:
      24. this.dialog.PrintPreviewControl.Columns = 2;
      25. this.dialog.PrintPreviewControl.Rows = 2;
      26. break;
      27. case 5:
      28. case 6:
      29. this.dialog.PrintPreviewControl.Columns = 3;
      30. this.dialog.PrintPreviewControl.Rows = 2;
      31. break;
      32. case 7:
      33. case 8:
      34. this.dialog.PrintPreviewControl.Columns = 4;
      35. this.dialog.PrintPreviewControl.Rows = 2;
      36. break;
      37. default:
      38. this.dialog.PrintPreviewControl.Columns = 5;
      39. this.dialog.PrintPreviewControl.Rows = 2;
      40. break;
      41. }
      42. }
      Die Aufteilung auf Zeilen und Spalten ist dann jedem selbst überlassen, hier eine 3x3-Seiten-Vorschau:

      Viel Spaß.
      Preview n Pages.zip
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!