PrintPreview-, PageSetup- und Print-Dialog

  • VB.NET

Es gibt 100 Antworten in diesem Thema. Der letzte Beitrag () ist von affrop.

    PrintPreview-, PageSetup- und Print-Dialog

    hallo leute,

    ich habe vor, ein diagramm zu drucken. dazu möchte ich es erst in einem printpreview-dialog anzeigen lassen. dort ggf. die über einen pagesetup-dialog seitenränder etc. definieren um dann beim click auf das druckersymbol im printpreview den printdialog zu öffnen, den drucker auswählen und hoffentlcih freuen, dass das diagramm aus dem drucker kommt.

    leider gibts da ein problem: der printpreview für sich funktioniert super, nur mit der einbindung des pagesetup und des printdialog gibts probleme, d.h. es passiert gar nix, außer dass der printdialog direkt beim öffnen des printpreview mit geöffnet wird.

    wollte eigentlich einen zusätzlichen button in die menüleiste des printpreview machen, so dass der pagesetup erst kommt, wenn man da drauf drück.

    hier mal der code:

    VB.NET-Quellcode

    1. Private WithEvents pd_PrintDoc As New System.Drawing.Printing.PrintDocument
    2. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    3. pd_PrintDoc = Chart1.Printing.PrintDocument
    4. AddHandler pd_PrintDoc.PrintPage, AddressOf Me.pd_PrintPage
    5. PrintPreviewDialog1.Document = pd_PrintDoc
    6. PageSetupDialog1.Document = pd_PrintDoc
    7. PrintPreviewDialog1.PrintPreviewControl.AutoZoom = True
    8. PrintPreviewDialog1.PrintPreviewControl.Dock = DockStyle.Fill
    9. PrintPreviewDialog1.PrintPreviewControl.Zoom = 1
    10. PrintPreviewDialog1.Document.DefaultPageSettings.Landscape = True
    11. PrintPreviewDialog1.Document.DefaultPageSettings.Margins = New Printing.Margins(79, 79, 79, 79)
    12. PrintPreviewDialog1.ShowIcon = True
    13. PrintPreviewDialog1.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink
    14. PrintPreviewDialog1.Controls.Add(PageSetupDialog1.Container)
    15. PrintPreviewDialog1.ShowDialog()
    16. If PageSetupDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    17. PrintPreviewDialog1.Document.DefaultPageSettings = PageSetupDialog1.PageSettings
    18. PrintPreviewDialog1.Document.PrinterSettings = PageSetupDialog1.PrinterSettings
    19. End If
    20. End Sub
    21. Private Sub pd_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles pd_PrintDoc.PrintPage
    22. PrintDialog1.Document = pd_PrintDoc
    23. If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    24. pd_PrintDoc.Print()
    25. End If
    26. End Sub


    vielleicht habt ihr ja ne idee woran es liegen könnte.

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

    @Rod: der link ist nicht zielführend. das projekt deines links basiert darauf mit mehreren buttons auf einer form diverse dialoge zu öffnen. will ich aber nicht.
    mein ziel ist, einmal den printpreview zu öffnen und dann bei bedarf aus dem printpreview heraus den pagesetup.

    affrop schrieb:

    der link ist nicht zielführend
    Entschuldige bitte, dass ich Dir keine fertige Lösung gepostet habe, die bekommst Du nicht.
    Beschäftige Dich mit dem Inhalt und verstehe, was dort passiert.
    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 habe mir sogar sein projekt geladen und den code angeschaut.
    er hat ne neue form gebaut auf der für jeden standard-dialog ein button existerit. beim click auf den jeweiligen button wird dialog.showdialog() ausgelöst.
    das könnte ich auch machen, aber das möchte ich nicht.
    ich möchte dem standard-printpreview-dialog einen zusätzlichen item in den toolstrip setzen und damit den pagesetup-dialog aufrufen.

    ein fertigen code will auch nicht. habe ja selbst was probiert und komme dort einfach nur nicht weiter.

    wie oben bereits gepostet habe ich es mit

    VB.NET-Quellcode

    1. PrintPreviewDialog1.Controls.Add(PageSetupDialog1.Container)


    versucht. hat nicht geklappt. habe es nun mit

    VB.NET-Quellcode

    1. PrintPreviewDialog1.MainMenuStrip.Items.Add("Seite einrichten", Nothing, onClick:=AddressOf Me.PageDialog_Show)


    versucht und klappt auch nicht. da kommt dann ne nullreferenceexception.

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

    affrop schrieb:

    versucht und klappt auch.
    Machma vorher

    VB.NET-Quellcode

    1. PrintPreviewDialog1.MainMenuStrip = New MenuStrip
    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!

    affrop schrieb:

    ohne meinen button.
    Da musst Du wohl mal tiefergehende Hilfe suchen, ich hab solch noch nicht gemacht.
    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!

    affrop schrieb:

    msdn
    Hab ich gemerkt. Das ist ggf. ein Fall für StackOverflow.
    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!
    so da bin ich wieder :)
    hab das ganze wochenende an dem problem gebastelt und auch ne lösung hin bekommen. habe dabei auch gleich den printdialog auf den druckerbutton ergänzt, denn normalerweise druckt der preview-dialog auf dem standarddrucker.
    jetzt habe ich nur noch das problem, dass wenn ich in pagesetup-dialog z.b. seitenränder ändere, die änderung nicht im preview-dialog angezeigt wird.

    hier mal mein code dazu:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. pd_PrintDoc = Chart1.Printing.PrintDocument
    3. PrintPreviewDialog1.Document = pd_PrintDoc
    4. PageSetupDialog1.Document = pd_PrintDoc
    5. PrintPreviewDialog1.PrintPreviewControl.AutoZoom = True
    6. PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.1
    7. PrintPreviewDialog1.Document.DefaultPageSettings.Landscape = True
    8. PrintPreviewDialog1.Document.DefaultPageSettings.Margins = New Printing.Margins(79, 79, 79, 79)
    9. PrintPreviewDialog1.ShowIcon = True
    10. PrintPreviewDialog1.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink
    11. PrintPreviewDialog1.WindowState = FormWindowState.Maximized
    12. PrintPreviewDialog1.ShowDialog()
    13. End Sub
    14. Private Sub GetControlsFromDialog(sender As Object, e As EventArgs) Handles PrintPreviewDialog1.Shown
    15. If PDFirstLoad = True Then
    16. Dim ts As ToolStrip = CType(PrintPreviewDialog1.Controls(1), ToolStrip)
    17. Dim PrintButtonItem As ToolStripItem = ts.Items("printToolStripButton")
    18. With PrintButtonItem
    19. Dim MyPrintButtonItem As ToolStripItem
    20. MyPrintButtonItem = ts.Items.Add(.Text, .Image, New EventHandler(AddressOf Me.PrintDialog_Show))
    21. MyPrintButtonItem.DisplayStyle = ToolStripItemDisplayStyle.Image
    22. ts.Items.Insert(0, MyPrintButtonItem)
    23. End With
    24. ts.Items.Remove(PrintButtonItem)
    25. Dim MyPageSetupItem As ToolStripItem
    26. MyPageSetupItem = ts.Items.Add("Seite einrichten", Nothing, New EventHandler(AddressOf Me.PageDialog_Show))
    27. MyPageSetupItem.DisplayStyle = ToolStripItemDisplayStyle.Text
    28. ts.Items.Insert(8, MyPageSetupItem)
    29. PDFirstLoad = False
    30. Else
    31. Exit Sub
    32. End If
    33. End Sub
    34. Private Sub PageDialog_Show(sender As Object, e As EventArgs)
    35. If PageSetupDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    36. pd_PrintDoc.DefaultPageSettings = PageSetupDialog1.PageSettings
    37. PrintPreviewDialog1.Invalidate()
    38. Else
    39. Exit Sub
    40. End If
    41. End Sub
    42. Private Sub PrintDialog_Show(sender As Object, e As EventArgs)
    43. If PrintDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    44. pd_PrintDoc.Print()
    45. End If
    46. End Sub

    affrop schrieb:

    die änderung nicht im preview-dialog angezeigt wird.
    Dann solltest Du die geänderten Werte hier reinschreiben:

    VB.NET-Quellcode

    1. PrintPreviewDialog1.Document.DefaultPageSettings.Landscape = True
    2. PrintPreviewDialog1.Document.DefaultPageSettings.Margins = New Printing.Margins(79, 79, 79, 79)
    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!
    ah, und mit dem PrintPreviewDialog funktioniert es jetzt?

    Was hast du tun müssen, dass das jetzt funktioniert?

    auch sehe ich im Code nirgends eine Anweisung, die den PageSetup ühaupt öffnen würde.

    oder du guckst mal in Mehrseitigen Text drucken - insbesondere ins Form_Load
    @Erfinder: der PageSetup wird hiermit geöffnet:

    VB.NET-Quellcode

    1. MyPageSetupItem = ts.Items.Add("Seite einrichten", Nothing, New EventHandler(AddressOf Me.PageDialog_Show))


    und was ich hab tun müssen damit es funktioniert siehe in meinem code das printpreviewdialog1.shown-event. offensichtlich wird das toolstrip erst zur laufzeit erstellt, deshalb konnte er vor dem anzeigen des dialoges nix an controls finden.

    und die änderungen sollten eigentlich hiermit übernommen werden:

    VB.NET-Quellcode

    1. If PageSetupDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    2. pd_PrintDoc.DefaultPageSettings = PageSetupDialog1.PageSettings
    3. PrintPreviewDialog1.Invalidate()
    scheint mir iwie sehr unübersichtlich, wie du dein Gui aufbaust.
    Wieso machst du das nicht einfach im Designer, und dann ganz normale Click-Handler-Methoden?
    Was du von deim Code zeigst, da fehlt halt einiges, etwa die Deklaration von pd_PrintDoc und vlt. mehr.
    Wie im Link gezeigt: Settings und PrintDoc sollten bereits im Form_Load korrekt konfiguriert sein - (jdfs. dann funzt das bei mir, jdfs. mit Drucken eines Textes.)
    Das PrintDocument habich im Designer abgehandelt - auch es an die Dialoge anzuschließen.
    @ erfinder: das pd_PrintDoc ist als globale variable deklariert:

    VB.NET-Quellcode

    1. Private WithEvents pd_PrintDoc As New System.Drawing.Printing.PrintDocument


    wie ich eingangs schon erwähnte, wollte ich die standard-dialoge von windows bzw. microsoft nutzen und einfach ergänzen. also in dem toolstrip den printpreview-dialoges einen zusätzlichen button einfügen, mit dem der pagesetup-dialog aufgerufne wird. und das funzt mit dem gezeigten code super, nur wenn der printpreview-dialog geöffnet ist und ich den pagesetup-dialog aufrufe und was ändere z.b. die seitenränder ändert sich die anzeige im printpreview-dialog nicht.

    ich hab schon etliches probiert wie etwa printpreviewdialog.invalidate() oder .update() oder .refresh(). aber funzt alles nich. die frage ist warum nicht?

    und zum thema übersichtlichkeit: ich finds eigentlich recht strukturiert. wie würdest du es denn schreiben?

    affrop schrieb:

    pd_PrintDoc ist als globale variable deklariert:
    Diese Print-Dinger solltest Du Dir alle über den Designer reinholen, da kannst Du auch gleich globale Querverweise, z.B. PrintDocument) eintragen.
    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!
    streng genommen könnte ich auch auf die globale deklaration des printdocument verzichten, denn ich will ein diagramm eines chart drucken. und das chart-steuerelement bring die chart1.printing.printdocument eigenschaft von haus aus mit. ändert aber nix am eigentlichen problem
    Tritt das Problem ohne chart1.printing.printdocument, dafür ein standard PrintDocument, ebenfalls auf?
    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!