Druck erzeugt 1 leere Seite am Ende

  • VB.NET

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

    Druck erzeugt 1 leere Seite am Ende

    Hallo zusamen,

    mit unten stehendem Code Drucke ich eine Liste mit Namen und zugehörigen Daten aus. Wenn das Limit von den eingestellten 35 Zeilen erreicht ist, wird auf Seite 2 gewechselt.
    Mit meinen 40 Testeinträgen habe ich mir Haltepunkte gesetzt und mal alle werte Überprüft. Die benötigte Seitenzahl wird auf 2 berechnet. So soll es sein.
    Allerdings wird beim Drucken (PDFCreator, FoxitReader PDFPrinter, PDF Architect etc.) am Ende immer eine Leere Seite erzeugt, obwohl nur 2 benötigt werden und auch nur 2 berechnet wurden.

    Sieht jemand im Code den Fehler oder kann mir einen Tipp geben woran es liegen könnte?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System.Drawing.Printing
    2. Imports Statistik.Dts
    3. Public Class dlgDruckenVertrieblerStatistik
    4. Private seitenZaehler As Integer
    5. Private benoetigteSeitenzahl As Integer
    6. Private actLine As Integer
    7. Private zeilenProSeite As Integer = 35
    8. Private _font As New Font("Segoe UI", 10)
    9. Private _fontBold As New Font("Segoe UI", 10, FontStyle.Bold)
    10. Private _fontHead As New Font("Segoe UI", 12)
    11. Private _fontSmall As New Font("Segoe UI", 8)
    12. Private _Brush As Brush = Brushes.Black
    13. Private LineHeight As Single = Me._font.GetHeight
    14. Private Sub seitenzahlberechnen()
    15. Dim VertrieblerCount As Integer = VertriebmitarbeiterBindingSource.Count - 1
    16. benoetigteSeitenzahl = CInt(Math.Ceiling(VertrieblerCount / zeilenProSeite))
    17. If benoetigteSeitenzahl = 0 Then
    18. ppc.Rows = 1
    19. Else
    20. ppc.Rows = benoetigteSeitenzahl
    21. End If
    22. End Sub
    23. Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    24. actLine = 0
    25. seitenZaehler = 1
    26. End Sub
    27. Public Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    28. Dim g = e.Graphics
    29. Dim x As Single = e.MarginBounds.Left
    30. Dim y As Single = e.MarginBounds.Top
    31. PrintDocument1.DocumentName = "Test Dokument"
    32. Dim printedLines = 0
    33. For i = actLine To actLine + zeilenProSeite - 1
    34. If i >= VertriebmitarbeiterBindingSource.Count Then ' bei -1 fehlt die letzte zu druckende Zeile
    35. Exit For
    36. End If
    37. printedLines += 1
    38. Dim rwVertriebler = VertriebmitarbeiterBindingSource.At(Of VertriebmitarbeiterRow)(i)
    39. Dim rwPlanCount = rwVertriebler.GetPlanRows.Where(Function(f) f.Uploaddatum >= dtpDruckenVon.Value AndAlso f.Uploaddatum <= dtpDruckenBis.Value AndAlso f.erledigt = True AndAlso f.berechnen = True).Count
    40. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x - 70, y + 40)
    41. g.DrawString(rwPlanCount.ToString, _font, _Brush, x + 200, y + 40)
    42. y += LineHeight + 10
    43. Next
    44. actLine += printedLines
    45. g.DrawString(String.Format("Seite {0} von {1}", seitenZaehler, benoetigteSeitenzahl), _fontSmall, _Brush, New Point(20, 1140))
    46. If seitenZaehler <= benoetigteSeitenzahl Then
    47. e.HasMorePages = True
    48. seitenZaehler += 1
    49. ElseIf actLine >= VertriebmitarbeiterBindingSource.Count - 1 Then
    50. e.HasMorePages = False
    51. End If
    52. End Sub
    53. Private Sub btnDrucken_Click(sender As Object, e As EventArgs) Handles btnDrucken.Click
    54. PrintDocument1.Print()
    55. End Sub
    56. Private Sub dlgDruckenVertrieblerStatistik_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    57. ppc.Document = PrintDocument1
    58. ppc.Zoom = 1.0
    59. For Each drucker As String In PrinterSettings.InstalledPrinters
    60. cboDrucker.Items.Add(drucker.ToString)
    61. Next
    62. cboDrucker.Text = PrintDocument1.PrinterSettings.PrinterName
    63. seitenzahlberechnen()
    64. 'ppc.InvalidatePreview()
    65. End Sub
    66. Private Sub dtpDrucken_CloseUp(sender As Object, e As EventArgs) Handles dtpDruckenVon.CloseUp, dtpDruckenBis.CloseUp
    67. ppc.InvalidatePreview()
    68. seitenzahlberechnen()
    69. End Sub
    70. Private Sub pnlDrucken_Paint(sender As Object, e As PaintEventArgs) Handles pnlDrucken.Paint
    71. e.Graphics.DrawLine(Pens.Black, pnlDrucken.Width - 1, 0, pnlDrucken.Width - 1, pnlDrucken.Height)
    72. End Sub
    73. Private Sub nudExemplare_ValueChanged(sender As Object, e As EventArgs) Handles nudExemplare.ValueChanged
    74. PrintDocument1.PrinterSettings.Copies = CShort(nudExemplare.Value)
    75. End Sub
    76. Private Sub cb_Drucken_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboDrucker.SelectedIndexChanged
    77. PrintDocument1.PrinterSettings.PrinterName = cboDrucker.SelectedItem.ToString
    78. ppc.Invalidate()
    79. End Sub
    80. End Class
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo

    Ist recht schwer ohne zu Debuggen.
    Setze mal bei If seitenZaehler <= benoetigteSeitenzahl Then.
    Ohnem mich da jetzt duch den Code zu fuxen könnte es hier liegen. Evtl. muss ja If seitenZaehler < benoetigteSeitenzahl Then her.

    Nur so aus der Hüfte geschossen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m Es geht einfacher :D
    @Akanel Überwache einzig die Zeile

    Akanel schrieb:

    VB.NET-Quellcode

    1. e.HasMorePages = True
    und überprüfe, ob die Bedingungen korrekt sind.
    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!