Die Leistungsfähigkeit der Druckfunktionen

Veröffentlicht: 25. Apr 2003 | Aktualisiert : 22. Jun 2004

Von Rockford Lhotka

Selbst in unserem Zeitalter, in dem die Digitalisierung immer weiter voranschreitet, hat das gedruckte Wort immer noch eine große Bedeutung. Auch die Anwendungsentwicklung umfasst i.d.R. das Schreiben von Berichten, obwohl die meisten von uns das als lästige Aufgabe empfinden. Microsoft Visual Studio® .NET wird mit einer Version von Crystal Reports geliefert. Darüber hinaus sind auch Bericht-Generatoren von Drittanbietern verfügbar, z.B. Active Reports. Diese Anwendungen sind sehr praktisch und leistungsstark, aber was ist, wenn uns etwas Einfacheres vorschwebt? Etwas, für das außer der .NET Framework-Laufzeit und unserer Anwendung keine zusätzlichen Komponenten installiert werden müssen?

Die Antwort liegt in der neuen Druckunterstützung, die in .NET Framework integriert ist. Diese beginnt bei der PrintDocument-Klasse, umfasst aber auch eine Reihe von anderen Klassen, einschließlich der PrintPageEventArgs-Klasse, die im Wesentlichen jede Seite eines Ausdrucks beschreibt.

Es gibt auch einige Windows Forms-Steuerelemente, die uns den Zugriff auf die allgemeinen Dialogfelder ermöglichen, die mit dem Druckprozess verbunden sind:

Windows Forms-Steuerelement

Funktion

PrintDialog

Öffnet das standardmäßige Druckdialogfeld, in dem der Benutzer einen bestimmten Drucker wählen und die Druckeroptionen ändern kann.

PrintPreviewDialog

Zeigt den Berichtinhalt in einem Druckvorschaufenster an.

PrintPreviewControl

Zeigt die erste Seite des Berichtinhalts in einem Steuerelement an, das auf eines der Formulare platziert werden kann.

PageSetupDialog

Öffnet das standardmäßige Dialogfeld zum Einrichten der Seite, in dem der Benutzer zwischen Hoch- und Querformat wählen und die Seitenränder ändern kann.

Das PrintDocument-Objekt unterscheidet sich erheblich von dem Printer-Objekt in vorherigen Versionen von Microsoft Visual Basic®. Mit dem Printer-Objekt der älteren Version rufen wir eine Reihe von Methoden des Objekts auf, um Text oder Grafiken zu zeichnen und dann zur nächsten Seite zu wechseln. Der Druckprozess war streng linear und wurde von unserem Code gesteuert. PrintDocument kehrt dies um, so dass das PrintDocument-Objekt die Steuerung übernimmt und Ereignisse aufruft, um dem Code mitzuteilen, wann es bereit ist, den Druckprozess zu starten, eine neue Seite zu generieren oder den Druckprozess zu beenden. Es kann einige Zeit dauern, bis Sie sich daran gewöhnt haben, denn dieses Objekt unterscheidet sich sehr von dem älteren Printer-Objekt.

Allerdings stellt das neue Objekt ein wichtiges Feature bereit, das zuvor gefehlt hat - die Druckvorschau. Nachdem wir unseren Code so geschrieben haben, dass das PrintDocument-Objekt zum Ausführen des Druckprozesses verwendet wird, kann unsere Ausgabe an den Drucker, an ein Druckvorschau-Steuerelement auf unserem Formular oder an ein Druckvorschau-Dialogfeld gerichtet werden. Die Unterstützung aller dieser Optionen ist in .NET Framework integriert.

Einfaches Drucken in Visual Basic .NET
Um in Visual Basic .NET zu drucken, erstellen wir ein PrintDocument-Objekt und reagieren auf seine Ereignisse BeginPrint, PrintPage und EndPrint.

Die Unterstützung für den Druckprozess kommt vom Namespace System.Drawing.Printing. Daher ist es am besten, diesen Namespace in Formulare oder Klassen zu importieren, die zum Drucken verwendet werden:

Imports System.Drawing.Printing

Bevor wir drucken können, müssen wir eine Reihe von wichtigen Objekten erstellen. Natürlich benötigen wir ein PrintDocument-Objekt, um den eigentlichen Druckprozess auszuführen, aber wir brauchen auch mindestens ein Font-Objekt. Jeder beliebige Text auf einer Seite wird in einer Schriftart gezeichnet, d.h., wir benötigen für jede auf der Seite verwendete Schriftart ein Font-Objekt.

Wir können diese Objekte in unserem Formular oder in Klassen deklarieren:

  Private WithEvents mDoc As New PrintDocument() 
  Private mFont As New Font("Courier New", 12)

Beachten Sie, dass das PrintDocument-Objekt mithilfe des WithEvents-Schlüsselworts deklariert wird. Dies ist erforderlich, weil der gesamte Druckcode aufgrund von Ereignissen ausgeführt wird, die vom PrintDocument-Objekt ausgelöst wurden. Wir können z.B. eine Reihe von Textzeilen auf eine Seite zeichnen:

  Private Sub mDoc_PrintPage(ByVal sender As Object, _ 
   ByVal e As System.Drawing.Printing.PrintPageEventArgs) _ 
   Handles mDoc.PrintPage 
 Dim xPos As Single = e.MarginBounds.Left 
 Dim yPos As Single = e.MarginBounds.Top 
 Dim lineHeight As Single = mFont.GetHeight(e.Graphics) 
 With e.Graphics 
   .DrawString("This is a test", _ 
  mFont, Brushes.Black, xPos, yPos) 
   yPos += lineHeight 
   .DrawString("This is another test", _ 
  mFont, Brushes.Black, xPos, yPos) 
   xPos += .MeasureString("This is another test", mFont).Width 
   .DrawString("Here's some more text", _ 
  mFont, Brushes.Black, xPos, yPos) 
   xPos = e.MarginBounds.Left 
 End With 
  End Sub

Das PrintPage-Ereignis wird jedes Mal vom PrintDocument-Objekt ausgelöst, wenn es eine neue Seite generieren muss. Der PrintPageEventArgs-Parameter, e, liefert uns alle Informationen, die wir benötigen, um Inhalt (Text oder Grafiken) auf der Seite zu zeichnen.

Das PrintPageEventArgs-Objekt stellt die aktuelle Seite dar und umfasst folgende wichtige Eigenschaften:

Eigenschaft

Funktion

Cancel

Eine Eigenschaft, die einen booleschen Wert enthält, der angibt, ob der Druckprozess abgebrochen werden soll.

Graphics

Das Graphics-Objekt, mit dem alle Zeichnungen durchgeführt werden. Dieses Graphics-Objekt stellt die Grafikoberfläche der Seite dar.

HasMorePages

Wenn wir am Ende dieser Seite noch nicht mit dem Drucken fertig sind und eine weitere Seite benötigen, um Inhalt zu platzieren, setzen wir diese Eigenschaft auf TRUE, um das PrintDocument-Objekt aufzufordern, das PrintPage-Ereignis erneut auszulösen.

MarginBounds

Dies ist ein Rectangle-Objekt, mit dem das durch die Ränder der Seite definierte Rechteck festgelegt wird. Die Ränder der Seite können vom Benutzer über PageSetupDialog geändert werden. Daher müssen diese Werte immer geprüft werden, um die Benutzerspezifikationen einzuhalten.

PageBounds

Dies ist ein Rectangle-Objekt, das durch die Ecken der Seitenfläche definiert wird. Alle Elemente, die außerhalb dieses Rechtecks gezeichnet werden, befinden sich nicht mehr im Druckbereich der gedruckten Seite. Die Größe des Rechtecks kann je nach Papierformat oder Druckausrichtung, d.h. Hoch- oder Querformat, variieren.

PageSettings

Dies ist ein PageSettings-Objekt, das Eigenschaften für alle Werte umfasst, die über das PageSetupDialog-Objekt festgelegt werden können. Wir können diese Informationen verwenden, um die Anzeige von Informationen zu verfeinern.

In unserem Codebeispiel verwenden wir das PrintPageEventArgs-Objekt, um die obere und linke Ecke der Seitenränder zu finden. Anschließend verwenden wir das Graphics-Objekt, um einen Zeichenfolgenwert auf der Seite zu zeichnen.

Es ist wichtig, zu erkennen, dass wir das Positionieren und Zeichnen von Text oder Grafiken auf dem Graphics-Objekt vollständig steuern können (und somit auch die gesamte Verantwortung übernehmen). Das bedeutet, dass wir unsere Position auf der Seite anhand der X- und Y-Koordinaten aufzeichnen müssen, damit wir uns je nach Bedarf auf der Seite hin- und herbewegen können. Zu diesem Zweck befinden sich die xPos- und yPos-Variablen in unserem Code.

Damit wir uns auf der Seite nach unten bewegen können, um jede Textzeile anzuzeigen, müssen wir die Höhe einer Textzeile kennen. Diese Höhe kann je nach verwendeter Schriftart und der Konfiguration des Graphics-Objekts variieren. Da eine Textzeile unterschiedlich hoch sein kann, verwenden wir die GetHeight-Methode für das Font-Objekt, um die Höhe einer Zeile zu bestimmen:

 Dim lineHeight As Single = mFont.GetHeight(e.Graphics)

Wir können diesen Wert jederzeit yPos hinzufügen, wenn wir uns auf der Seite um eine Zeile nach unten bewegen müssen.

Gelegentlich müssen wir uns auch nach rechts bewegen, und zwar genau hinter den Text, den wir auf der Seite gezeichnet haben. In diesem Fall können wir die MeasureString-Methode für das Graphics-Objekt verwenden, um die Breite einer bestimmten Zeichenfolge zu bestimmen, die auf der Seite in einer bestimmten Schriftart gezeichnet ist. Indem wir xPos diesen Wert hinzufügen, bewegen wir unsere Zeichenposition nach rechts:

   xPos += .MeasureString("This is another test", mFont).Width

Da wir den Text messen, den wir gerade auf der Seite gezeichnet haben, haben wir uns tatsächlich an eine Position direkt rechts neben diesem Text bewegt. Auf diese Weise wird verhindert, dass der nächste Text, den wir auf dieser Seite schreiben, mit dem vorherigen Text überlappt, obwohl er sich in derselben Zeile befindet.

Dies wirft einen interessanten Punkt auf. Nichts kann uns daran hindern, Texte oder Grafiken über Texte oder Grafiken zu schreiben, die bereits auf der Seite vorhanden sind. Am besten stellen Sie sich die Seite als ein Blatt Papier vor, auf dem wir mit einem Stift zeichen. Wir können Formen zeichnen, Linien kritzeln und Text schreiben. Wenn wir nicht aufpassen, können wir einigen Schaden anrichten.

An diesem Punkt müssen wir lediglich Code schreiben, um den Druckprozess zu starten. Wenn wir uns in einem Formular befinden, könnten wir den Druckprozess über eine Schaltfläche initiieren:

  Private Sub btnSimple_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnSimple.Click 
 mDoc.Print() 
  End Sub

Dies veranlasst das PrintDocument-Objekt, sein PrintPage-Ereignis aufzurufen, damit wir unseren Text auf der Seitenfläche zeichnen können. Da wir die HasMorePages-Eigenschaft nicht auf TRUE gesetzt haben, weiß das PrintDocument-Objekt, dass keine weiteren Seiten folgen und die Generierung der Ausgabe somit abgeschlossen ist. Die Ergebnis wird an den auf dem Computer eingerichteten Standarddrucker gesendet und ausgedruckt.

Verwenden von Druckdialogfeldern
Oftmals möchten wir dem Benutzer mehr Kontrolle über den Druckprozess gewähren. Hier kommen die verschiedenen Druckdialogfelder ins Spiel. Wir können sie verwenden, um es dem Benutzer zu ermöglichen, den Drucker auszuwählen und die Drucker- und Seiteneinstellungen festzulegen.

Diese Dialogfelder sind Teil von Windows Forms. Es gibt keine Entsprechungen dieser Steuerelemente in Web Forms, da der Druckprozess in der Webumgebung i.d.R. von einem Browser und nicht direkt mithilfe von Code behandelt wird.

PrintDialog
Das PrintDialog-Steuerelement ermöglicht uns das Anzeigen der standardmäßigen Microsoft Windows®-Dialogfelder zur Druckerauswahl und -konfiguration. Indem wir dieses Dialogfeld anzeigen, ermöglichen wir es dem Benutzer, den gewünschten Drucker auszuwählen und anschließend die Einstellungen für diesen Drucker zu ändern. Der Benutzer hat zudem die Möglichkeit, in diesem Dialogfeld auf die Schaltfläche Abbrechen zu klicken. In diesem Fall sollte der Druckprozess nicht fortgesetzt werden.

In einem Formular können wir folgenden Code schreiben, um das Dialogfeld zu verwenden:

  Private Sub btnPrintDialog_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnPrintDialog.Click 
 Dim dlg As New PrintDialog() 
 dlg.Document = mDoc 
 If dlg.ShowDialog = DialogResult.OK Then 
   mDoc.Print() 
 End If 
  End Sub

Wir erstellen lediglich das Dialogfeldobjekt und versehen es mit einen Verweis auf das PrintDocument-Objekt. Dieser Verweis ist erforderlich, weil das Dialogfeld die Druckereinstellungen für unser PrintDocument-Objekt ändert (wenn der Benutzer auf OK klickt).

Wenn wir die ShowDialog-Methode aufrufen, wird das in Abbildung 1 dargestellte Dialogfeld geöffnet.

vbnet12242002-fig01.gif

Abbildung 1. Das standardmäßige Dialogfeld "Drucken"

Der Benutzer kann in der Liste einen anderen Drucker auswählen oder die Eigenschaften des Druckers ändern. Das angezeigte Fenster mit den spezifischen Eigenschaften variiert je nach Druckertyp. Abbildung 2 zeigt ein Beispiel für ein solches Fenster.

vbnet12242002-fig02.gif

Abbildung 2. Ein Druckereigenschaftenfenster

Beachten Sie, dass die meisten Optionen im standardmäßgen Dialogfeld abgeblendet sind. Wir können sie aktivieren, wenn wir den Code für den Druckprozess so schreiben möchten, dass diese Optionen berücksichtigt werden. Das PrintDialog-Objekt umfasst die folgenden Eigenschaften, mit denen die Darstellung des Dialogfelds gesteuert wird:

Eigenschaft

Funktion

AllowPrintToFile

Wenn diese Eigenschaft auf TRUE gesetzt ist, wird die Option zum Drucken in eine Datei aktiviert.

AllowSelection

Wenn diese Eigenschaft auf TRUE gesetzt ist, wird die Option zum ausschließlichen Drucken der aktuellen Auswahl aktiviert.

AllowSomePages

Wenn diese Eigenschaft auf TRUE gesetzt ist, kann der Benutzer einen Bereich von Seiten angeben, die gedruckt werden sollen. Um diese Option verwenden zu können, müssen wir zunächst die Eigenschaften PrinterSettings.MaximumPage und PrinterSettings.MinimumPage für das PrintDocument-Objekt auf die größte und kleinste Seitenzahl festlegen, die zum Drucken verfügbar ist.

Wenn wir alle drei Eigenschaften aktivieren, sieht das Dialogfeld so aus wie in Abbildung 3.

vbnet12242002-fig03.gif

Abbildung 3. Das Dialogfeld "Drucken", wenn alle "Allow"-Optionen aktiviert sind

Beachten Sie, dass wir durch Aktivieren dieser Eigenschaften entscheiden können, ob die Benutzereingabe berücksichtigt wird. Das PrintDocument-Objekt hat eine PrinterSettings-Eigenschaft, die wir verwenden können, um Zugriff auf die Druckereinstellungen zu erhalten, die der Benutzer gewählt hat. Das PrinterSettings-Objekt umfasst folgende wichtige Eigenschaften, die wir verwenden können, um die Benutzerauswahl zu berücksichtigen:

Eigenschaft

Funktion

PrintRange

Zeigt die Gesamtauswahl des Benutzers zwischen AllPages, Selection oder SomePages an.

FromPage

Wenn PrintRange auf SomePages eingestellt ist, gibt diese Eigenschaft die erste zu druckende Seite an.

ToPage

Wenn PrintRange auf SomePages eingestellt ist, gibt diese Eigenschaft die letzte zu druckende Seite an.

PrintToFile

Zeigt an, dass der Benutzer in eine Datei und nicht auf dem Drucker drucken möchte.

Wir prüfen diese Werte im PrintPage-Ereignishandler und stellen anhand dieser Werte sicher, dass nur das richtige Material gedruckt wird.

Alle vom Benutzer vorgenommenen Änderungen werden in das PrintDocument-Objekt übernommen, wenn der Benutzer auf OK klickt. Beachten Sie, dass der Aufruf von ShowDialog in einer If..Then-Anweisung enthalten ist, so dass wir feststellen können, ob der Benutzer auf OK geklickt hat. Wenn der Benutzer auf OK geklickt hat, müssen wir lediglich die Print-Methode für das PrintDocument-Objekt aufrufen, um den Druckprozess auszulösen.

PageSetupDialog
Benutzer möchten gern die Möglichkeit haben, das Papierformat, das Layout und die Seitenränder festzulegen. Diese Einstellungen werden im Dialogfeld Seite einrichten vorgenommen, das mit dem folgenden Code aufgerufen werden kann:

  Private Sub btnPageDialog_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnPageDialog.Click 
 Dim dlg As New PageSetupDialog() 
 dlg.Document = mDoc 
 dlg.ShowDialog() 
  End Sub

Wir erstellen eine Instanz des Dialogfeldobjekts und versehen es mit einem Verweis auf das PrintDocument-Objekt. Im Dialogfeld werden die aktuellen Seiteneinstellungen für unser Dokument angezeigt. Wenn der Benutzer auf OK klickt, werden die vom Benutzer im Dialogfeld vorgenommenen Änderungen im PrintDocument-Objekt widergespiegelt.

Das angezeigte Dialogfeld sieht ähnlich wie das Dialogfeld in Abbildung 4 aus.

vbnet12242002-fig04.gif

Abbildung 4. Das Dialogfeld "Seite einrichten"

Wenn wir dieses Dialogfeld verwenden, müssen wir die Auswahl des Benutzers berücksichtigen, indem wir im PrintPage-Code, den wir zum Generieren der einzelnen Seiten schreiben, die Benutzerauswahl erkennen und darauf reagieren. Wir können steuern, welche spezifischen Optionen dem Benutzer zur Verfügung stehen, indem wir die folgenden Eigenschaften für das Dialogfeldobjekt festlegen:

Eigenschaft

Funktion

AllowMargins

Wenn diese Eigenschaft auf FALSE gesetzt ist, kann der Benutzer die Seitenränder nicht ändern.

AllowOrientation

Wenn diese Eigenschaft auf FALSE gesetzt ist, kann der Benutzer die Druckausrichtung, d.h. Hoch- oder Querformat, nicht ändern.

AllowPaper

Wenn diese Eigenschaft auf FALSE gesetzt ist, kann der Benutzer die Papierauswahl nicht ändern.

AllowPrinter

Wenn diese Eigenschaft auf FALSE gesetzt ist, ist die Schaltfläche Drucker deaktiviert.

MinMargins

Diese Eigenschaft gibt in Millimetern den Mindestwert an, den der Benutzer für den Rand eingeben kann.

Wenn dem Benutzer nicht erlaubt werden soll, die Seiteneinstellungen zu ändern, müssen wir die PageSettings-Eigenschaft des PrintPageEventArgs-Parameters im PrintPage-Ereignishandler verwenden. Bei der Generierung der einzelnen Seiten können wir das PageSettings-Objekt verwenden, um die Auswahl des Benutzers zu erkennen. Zu den Haupteigenschaften des PageSettings-Objekts gehören:

Eigenschaft

Funktion

Bounds

Ein Rectangle-Objekt, das durch die Größe der Seite definiert wird. Hierbei wird die vom Benutzer gewählte Ausrichtung berücksichtigt (entspricht der PageBounds-Eigenschaft von PrintPageEventArgs).

Color

Zeigt an, ob die Seite farbig gedruckt werden soll.

Landscape

Zeigt an, ob die Seite im Hoch- oder Querformat gedruckt werden soll.

Margins

Ein Rectangle-Objekt, das von den Rändern der Seite definiert wird (entspricht der MarginBounds-Eigenschaft von PrintPageEventArgs).

Indem wir diese Eigenschaften beim Generieren der Ausgabe der einzelnen Seiten verwenden, können wir die Ausgabe basierend auf der Benutzerauswahl an die Seite anpassen.

Implementieren der Druckvorschau
Das aufregendste Feature des neuen Druckprozessmechanismus in .NET Framework ist die integrierte Unterstützung für die Druckvorschau. Diese Unterstützung wird von einem Druckvorschau-Dialogfeld und einem Steuerelement bereitgestellt, das wir direkt auf unsere Formulare platzieren können, um eine Vorschau der ersten Seite eines PrintDocument-Objekts anzuzeigen.

Unabhängig davon, welche zuvor erwähnten Methoden verwendet werden, muss der Code zum Drucken nicht geändert werden, um die Druckvorschau zu integrieren. Wenn eine Druckvorschau angefordert wird, ruft das PrintDocument-Objekt PrintPage-Ereignisse auf, so wie dies auch beim Drucken auf einem Drucker der Fall ist. Alle Details in Bezug auf die Wiedergabe der Ausgabe in einer Vorschauanzeige werden automatisch durchgeführt, so dass wir uns nicht darum kümmern müssen.

Verwenden des Druckvorschau-Dialogfelds
PrintPreviewDialog wird auf ähnliche Weise wie die anderen Dialogfelder aufgerufen. Wir erstellen eine Instanz des Dialogfeldobjekts, versehen es mit einem Verweis auf das PrintDocument-Objekt, und zeigen das Dialogfeld an:

  Private Sub btnPreview_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnPreview.Click 
 Dim dlg As New PrintPreviewDialog() 
 dlg.Document = mDoc 
 dlg.WindowState = FormWindowState.Maximized 
 dlg.ShowDialog() 
  End Sub

In diesem Fall haben wir auch angegeben, dass das Dialogfeld als Vollbild angezeigt wird, indem wir die WindowState-Eigenschaft ändern. Weitere standardmäßige Form-Objekteigenschaften werden vom Dialogfeld offen gelegt. Dies ermöglicht uns ein hohes Maß an Flexibilität bei der Anzeige des Dialogfelds. Abbildung 5 zeigt die Darstellung des Dialogfelds Druckvorschau.

vbnet12242002-fig05.gif

Abbildung 5. Ein Druckvorschau-Dialogfeld

Wenn die ShowDialog-Methode aufgerufen wird, löst das Dialogfeld einen Druckvorgang für das PrintDocument-Objekt aus, woraufhin das Objekt das PrintPage-Ereignis für jede Seite aufruft, so dass wir die Ausgabe generieren können. In diesem Fall wird der PrintPageEventArgs-Parameter verwendet, um eine Druckvorschau der Graphics-Objekte anzuzeigen, anstatt die Ausgabe an den Drucker zu leiten. Wir müssen aber unseren Code nicht ändern, damit er funktioniert.

Verwenden des Druckvorschau-Steuerelements
Wir können auch die erste Seite einer Druckvorschau direkt in einem unserer Formulare anzeigen, indem wir das PrintPreviewControl-Steuerelement verwenden. Dieses Steuerelement befindet sich in der Toolbox und kann direkt auf ein Formular gezogen und wie andere Steuerelemente platziert werden.

Damit das Steuerelement eine Druckvorschau anzeigt, müssen wir ihm einfach einen Verweis auf das PrintDocument-Objekt hinzufügen:

  Private Sub btnPreviewControl_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnPreviewControl.Click 
 prevDisplay.Document = mDoc 
  End Sub

Durch das Festlegen dieser Eigenschaft wird das Steuerelement veranlasst, die Print-Methode für das PrintDocument-Objekt aufzurufen. Dieses löst dann das PrintPage-Ereignis aus, damit jede Seite der Ausgabe generiert wird. Abbildung 6 zeigt ein Formular, auf dem das Steuerelement angezeigt wird.

vbnet12242002-fig06.gif

Abbildung 6. Ein Formular mit "PrintPreviewControl"-Steuerelement

Beachten Sie, dass das Steuerelement nur die erste Seite anzeigt. Dennoch wird mit dem PrintDocument-Objekt der gesamte Bericht generiert. Da dies oft nicht gewünscht ist, wäre es besser, wenn man zuerst einen Druckbereich für das Dokument festlegen könnte:

  Private Sub btnPreviewControl_Click(ByVal sender As System.Object, _ 
   ByVal e As System.EventArgs) Handles btnPreviewControl.Click 
 With mDoc.PrinterSettings 
   .PrintRange = PrintRange.SomePages 
   .FromPage = 1 
   .ToPage = 1 
 End With 
 prevDisplay.Document = mDoc 
  End Sub

Wenn wir diesen Ansatz verwenden, müssen wir natürlich auch unseren Code im PrintPage-Ereignishandler aktualisieren, damit diese Werte geprüft werden und der Druckprozess nach dem Generieren von Seite 1 beendet wird. Wenn wir den Code nicht aktualisieren, werden diese Einstellungen ignoriert.

Schlussfolgerung
Manuelles Drucken ist nicht einfach. Es erfordert, dass wir Texte und Grafiken auf der Seitenfläche zeichnen und geeignete Positionen auswählen. Zudem müssen wir aufzeichnen, welche Daten angezeigt werden sollen, wenn die PrintPage-Ereignisse für jede Seite ausgelöst werden. Dieses Druckmodell ist jedoch sehr leistungsstark und flexibel und ermöglicht es uns, theoretisch jeden nur denkbaren Ausgabetyp zu generieren. Und es gibt noch einen weiteren Vorteil. Sobald wir Code zum Generieren der Ausgabe erstellt haben, erhalten wir automatisch Unterstützung für Drucker und auch für die Druckvorschau.

Kombiniert man dieses Druckmodell mit dem einfachen Zugriff auf Druckerdialogfelder und Dialogfelder zur Seiteneinrichtung und der von .NET Framework bereitgestellten Druckunterstützung, bietet sich eine gute Alternative für das Generieren von Ausdrucken, insbesondere wenn keine Bericht-Generatoren von Drittanwendern, z.B. Crystal Reports oder Active Reports, bereitgestellt werden sollen.

Download

"vbprint.exe"