Drucken einer Form mit Druckerauswahl

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Drucken einer Form mit Druckerauswahl

    Hallo,

    ich hab mich schon durch das Forum und Google gelesen, finde aber keine Lösung meines Problems mit der ich klar komme... ich will per Button die gerade offene Form so wie sie angezeigt wird als PDF drucken lassen. Das Problem ist , das jeder der Anwender andere Drucker installiert hat und manche den Acrobat Writer, manche den pdf-Creator oder wieder andere. Daher hätte ich es gerne, dass beim drücken des Drucken-Buttons erst die installierten Drucker angezeigt werden und dann der entsprechende gewählt werden kann.

    Das Drucken an sich is ja recht einfach und funktioniert problemlos, aber halt nur über den Standarddrucker.

    Danke schonmal!!


    Das bisherige Element ist:

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.PowerPacks.Printing
    2. .
    3. .
    4. .
    5. Private Sub cmdPrint_Click(sender As Object, e As EventArgs) Handles cmdPrint.Click
    6. Dim pf As New PrintForm
    7. pf.Form = Me
    8. pf.PrintAction = System.Drawing.Printing.PrintAction.PrintToPreview
    9. pf.Print()
    10. End Sub


    VB-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @GoCat Ohne VisualBasic mit .NET geht das so.
    Form, Button, PrintDocument:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private bmp As Bitmap
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg As New PrintDialog
    5. dlg.Document = Me.PrintDocument1
    6. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    7. Return
    8. End If
    9. Me.bmp = New Bitmap(Me.Width, Me.Height)
    10. Me.DrawToBitmap(Me.bmp, New Rectangle(0, 0, Me.Width, Me.Height))
    11. Using dlg2 As New PrintPreviewDialog
    12. dlg2.Document = Me.PrintDocument1
    13. If dlg2.ShowDialog <> Windows.Forms.DialogResult.OK Then
    14. Return
    15. End If
    16. End Using
    17. End Using
    18. End Sub
    19. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    20. If Me.bmp Is Nothing Then
    21. Return
    22. End If
    23. e.Graphics.DrawImage(Me.bmp, New Point(30, 30))
    24. End Sub
    25. End Class
    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!
    Funktioniert (noch) nicht..

    Er bringt beim letzten Private Sub einen Fehler "Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird."...

    Edit: jetz hab ichs hinbekommen dass zwar die Druckerauswahl erscheint, aber dann kommt nix mehr...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GoCat“ ()

    Sorry, ich schnalls nicht! Das mein Wunsch meine Programmier-Kenntnisse übersteigt is mir schon klar, aber ich kapier null-komma-nix was du in deinem Code machst.. (und die CP-Bremse find ich auch nicht...) Könntest Du vielleicht mit dazu schreiben was du mit dem jeweiligen Befehl bezweckst? Erstens zum Dazu-Lernen und ausserdem wenn ich eine Funktion einbaue würd ichs gerne verstehen was ich mache...

    GoCat schrieb:

    würd ichs gerne verstehen
    Also:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private bmp As Bitmap ' Bitmap-Objekt für das Abbild der Form
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Using dlg As New PrintDialog ' Instanziierung des Druck-Dialoges
    5. dlg.Document = Me.PrintDocument1 ' diesem Zugriff auf das zu druckende Dokument geben
    6. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then ' Cancel => raus
    7. Return
    8. End If
    9. Me.bmp = New Bitmap(Me.Width, Me.Height) ' Bitmap-Instanz erzeugen
    10. Me.DrawToBitmap(Me.bmp, New Rectangle(0, 0, Me.Width, Me.Height)) ' Form sich da reinmalen lassen
    11. Using dlg2 As New PrintPreviewDialog ' Instanziierung des Druck-Vorschau-Dialoges
    12. dlg2.Document = Me.PrintDocument1 ' diesem Zugriff auf das zu druckende Dokument geben
    13. If dlg2.ShowDialog <> Windows.Forms.DialogResult.OK Then ' Cancel => raus
    14. Return
    15. End If
    16. ' OK gedrückt => es wird das PrintPage-Event ausgelöst
    17. End Using
    18. End Using
    19. End Sub
    20. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    21. If Me.bmp Is Nothing Then ' Sicherheitsabfrage
    22. Return
    23. End If
    24. ' Malen des Bildes in das Druckdokument
    25. e.Graphics.DrawImage(Me.bmp, New Point(30, 30))
    26. End Sub
    27. End Class
    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!

    Rainman schrieb:

    ordentliche Programmdoku
    Das meiste sind allerdings Grundlagen, die würden dann nicht mehr dokumentiert werden.
    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!
    Ich kriegs nicht hin....

    Jetzt kommt eine Fehlermeldung: "Der Wert vom Typ "Microsoft.VisualBasic.PowerPacks.Printing.PrintForm" kann nicht in "System.Drawing.Printing.PrintDocument" konvertiert werden."

    Hab am Anfang ganz vergessen zu sagen das ich MS Visual Studio Express 2012 verwende....

    EDIT: hab hier noch was gefunden: "http://www.tutorialspoint.com/vb.net/vb.net_print_dialog.htm". Das funktioniert ganz gut, außer das nur ein leeres pdf ertellt wird........

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GoCat“ ()

    GoCat schrieb:


    Jetzt kommt eine Fehlermeldung: "Der Wert vom Typ "Microsoft.VisualBasic.PowerPacks.Printing.PrintForm" kann nicht in "System.Drawing.Printing.PrintDocument" konvertiert werden."


    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.PowerPacks.Printing


    VB.NET-Quellcode

    1. Imports System.Drawing.Printing.PrintDocument

    Imports Microsoft.VisualBasic.PowerPacks.Printing nimmst du raus.

    Versuche es mal damit.
    Gruß

    PS:

    GoCat schrieb:

    EDIT: hab hier noch was gefunden: "http://www.tutorialspoint.com/vb.net/vb.net_print_dialog.htm". Das funktioniert ganz gut, außer das nur ein leeres pdf ertellt wird........


    Wie soll er auch was Drucken?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. PrintDialog1.Document = PrintDocument1
    3. PrintDialog1.PrinterSettings = PrintDocument1.PrinterSettings
    4. PrintDialog1.AllowSomePages = True
    5. If PrintDialog1.ShowDialog = DialogResult.OK Then
    6. PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings
    7. PrintDocument1.Print()
    8. End If
    9. End Sub


    VB.NET-Quellcode

    1. PrintDokument1

    Muss Definiert werden.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „LittleHH“ ()

    Das "Imports" is draussen.. daher gehts ja auch! :)

    "Muss definiert werden.": Das dachte ich mir auch schon.... aber wie sag ich ihm das er die ganze Form so wie sie angezeigt wird auch druckt?

    Ich glaub ich hab total das Brett vorm Kopf.... ich probier schon seit ner Woche rum damit. Die anderen Sachen im Programm sind kein Problem, das was es soll, macht es auch, aber hier muß ich das erste mal aus dem Programm nach aussen gehen....

    GoCat schrieb:


    "Muss definiert werden.": Das dachte ich mir auch schon.... aber wie sag ich ihm das er die ganze Form so wie sie angezeigt wird auch druckt?


    Ok also ich hab ma schnell was fertig gemacht.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Importieren der Druckerklasse
    2. Imports System.Drawing.Printing.PrintDocument
    3. Public Class Form1
    4. ' Bitmap-Objekt für die aktuelle Form
    5. Dim oBitmap As Bitmap
    6. ' Objekte für Seitenvorschau
    7. Dim WithEvents PrintDocument As New Printing.PrintDocument
    8. Dim PrintPreview As New PrintPreviewDialog
    9. ' aktiven Fensterinhalt in die
    10. ' Zwischenablage kopieren und ausdrucken
    11. Private Sub Button1_Click(ByVal sender As System.Object, _
    12. ByVal e As System.EventArgs) Handles Button1.Click
    13. ' Screenshot des aktiven Fensters erstellen
    14. SendKeys.Send("%({PRTSC})")
    15. SendKeys.Flush()
    16. ' Bitmap-Objekt aus Zwischenablage kopieren
    17. oBitmap = CType(Clipboard.GetImage(), Bitmap)
    18. ' in Seitenvorschau anzeigen
    19. With PrintPreview
    20. .Document = PrintDocument
    21. .ShowDialog()
    22. End With
    23. End Sub
    24. ' Hier erfolgt der Ausdruck des Bitmaps
    25. Private Sub PrintDocument_PrintPage(ByVal sender As Object, _
    26. ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
    27. Handles PrintDocument.PrintPage
    28. ' Bitmap-Objekt drucken
    29. Dim gr As Graphics = e.Graphics
    30. gr.DrawImageUnscaled(oBitmap, e.MarginBounds.X, e.MarginBounds.Y)
    31. e.HasMorePages = False
    32. ' Bitmap löschen
    33. oBitmap.Dispose()
    34. End Sub
    35. End Class

    ach du Schande.... soviel Code nur um was zu drucken? In meinem ersten Beitrag sinds ja nur 5 Zeilen um den Standarddrucker anzusprechen! Ich will doch nur das die Abrage welcher Drucker drucken soll zwischen Mausklick und drucken kommt...... :(

    Mit deinem Code kommt die Druckvorschau, beim Drucken wird wieder nur der Standardrucker angesprochen und es kommt "Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten. Zusätzliche Informationen: Ungültiger Parameter."

    oder abwechselnd mit obiger Meldung auch diese: "2In System.ArgumentNullException ist eine Ausnahme vom Typ "System.Drawing.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet. Zusätzliche Informationen: Der Wert darf nicht NULL sein."

    GoCat schrieb:

    nicht behandelte Ausnahme
    Nimm ein neues Projekt, eine Form mit Button und PrintDocument und ausschließlich meinen Code.
    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!

    RodFromGermany schrieb:

    ausschließlich meinen Code.


    Damit funktionierts jetzt, danke!! Lustigerweise nimmt er aber jetzt immer Hochformat! Egal ob ichs auf deine Weise mache, oder mit dem 5-Zeiler direkt den Standarddrucker anspreche schneidet er die Hälfte ab. Bisher hat er wenigstens automatisch auf die Seite eingepasst...

    Aber trotzdem: Das Ergebnis is blöderweise nicht so wie ichs gerne hätte........... ;(

    Ich denke ernsthaft darüber nach die Ergebnisse in Excel zu exportieren, aber da ich momentan 15 verschiedene Formen brauche (und es mit der Zeit eher mehr werden), da tipp ich mich ja wund für jede Form den Export zu regeln!

    GoCat schrieb:

    Hochformat
    Da gibt es eine Einstellung für:
    LandScape bzw. Portrait.
    Das findest Du selbst. ;)
    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!

    GoCat schrieb:

    Wie müsste der Mittelteil aussehen
    Vielleicht postest Du mal Deinen ganzen Code.
    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!
    Das is im Prinzip dein Code.... ich hab nur das Landscape mit reingemacht und das zum Drucken die Buttons aus- und eine Dokumentennummer eingeblendet wird.

    VB.NET-Quellcode

    1. 'DRUCKEN!!
    2. Private bmp As Bitmap
    3. Private Sub cmdPrint_Click(sender As Object, e As EventArgs) Handles cmdPrint.Click
    4. 'Ausblenden Buttons
    5. cmdBack3.Visible = False
    6. cmdBerechnen.Visible = False
    7. cmdPrint.Visible = False
    8. cmdEndProgram.Visible = False
    9. 'Einblenden Dokumentennummer für Drucken
    10. lblLaschDok.Visible = True
    11. lblLaschDok.Text = "C-" & ZGNummer & "-" & ZGAusf
    12. Using dlg As New PrintDialog ' Instanziierung des Druck-Dialoges
    13. dlg.Document = Me.PrintDocument1
    14. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then ' Cancel => raus
    15. Return
    16. End If
    17. Me.bmp = New Bitmap(Me.Width, Me.Height) ' Bitmap-Instanz erzeugen
    18. PrintDocument1.DefaultPageSettings.Landscape = True
    19. Me.DrawToBitmap(Me.bmp, New Rectangle(0, 0, Me.Width, Me.Height)) ' Form sich da reinmalen lassen
    20. Using dlg2 As New PrintPreviewDialog ' Instanziierung des Druck-Vorschau-Dialoges
    21. dlg2.Document = Me.PrintDocument1 ' diesem Zugriff auf das zu druckende Dokument geben
    22. If dlg2.ShowDialog <> Windows.Forms.DialogResult.OK Then ' Cancel => raus
    23. Return
    24. End If
    25. ' OK gedrückt => es wird das PrintPage-Event ausgelöst
    26. End Using
    27. End Using
    28. End Sub
    29. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    30. If Me.bmp Is Nothing Then ' Sicherheitsabfrage
    31. Return
    32. End If
    33. ' Malen des Bildes in das Druckdokument
    34. e.Graphics.DrawImage(Me.bmp, New Point(30, 30))
    35. 'Einblenden Buttons
    36. cmdBack3.Visible = True
    37. cmdBerechnen.Visible = True
    38. cmdPrint.Visible = True
    39. cmdEndProgram.Visible = True
    40. 'Ausblenden Dokumentennummer
    41. lblLaschDok.Visible = False
    42. End Sub

    GoCat schrieb:

    mit reingemacht
    und wo ist das Problem?
    Wenn Du Buttons hin- und her-schaltest, nimm dafür die Events PrintDocument.BeginPrint und PrintDocument.EndPrint.
    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!