Drucken von mehreren Seiten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Akanel schrieb:

    Also ist die For-Schleife nicht für mein Vorhaben geeignet?
    Das kann man so nicht sagen.
    Du musst nur Start und Ende dieser Schleife variabel halten und diese Werte passend zur Seitenlänge und Seitennummer wählen.
    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 nochmal von null angefangen und mich langsam herangetastet.

    ich habe mal 5 seiten erstellt und versucht zu drucken. Hat Funktioniert
    Dann einen String mit 2 Zeilen erstellt und versucht die Zeilen auszulesen, wie viele gedruckt wurden. Hat auch geklappt.

    Nun habe ich versucht eine List(Of String) zu drucken, und dort die Zeilen zu ermitteln. Das hat nun nicht funktioniert. Es wird immer eine angezeigt.

    Wo mache ich den Fehler?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System.Drawing.Printing
    2. Public Class Form1
    3. Private seitenNummer As Integer
    4. Private _font As New Font("Segoe UI", 14)
    5. Private _brush As Brush = Brushes.Black
    6. 'Private stringToPrint As String = "Eine Zeile" & Environment.NewLine & "Noch eine Zeile"
    7. Private stringToPrint2 As New List(Of String)
    8. Private stringFormat As New StringFormat(StringFormatFlags.LineLimit)
    9. Private charactersFitted As Integer
    10. Private linesFilled As Integer
    11. 'TODO Druck mehrseitig ausgeben
    12. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    13. Dim xOffset As Integer = e.MarginBounds.Left
    14. Dim yOffset As Integer = e.MarginBounds.Top
    15. For i = 0 To 10
    16. stringToPrint2.Add("Zeile Nr: " & i)
    17. Next
    18. With e.Graphics
    19. .DrawString(String.Format("Seite: {0}", seitenNummer), _font, _brush, xOffset + 500, yOffset)
    20. For Each a In stringToPrint2
    21. .MeasureString(a, _font, e.MarginBounds.Size, stringFormat, charactersFitted, linesFilled)
    22. .DrawString(a, _font, _brush, xOffset, yOffset, stringFormat)
    23. yOffset += 20
    24. Next
    25. '.MeasureString(stringToPrint, _font, e.MarginBounds.Size, stringFormat, charactersFitted, linesFilled)
    26. '.DrawString(stringToPrint, _font, _brush, xOffset, yOffset, stringFormat)
    27. .DrawString(String.Format("Zeilen: {0}", linesFilled), _font, _brush, xOffset + 500, yOffset + 30)
    28. End With
    29. seitenNummer += 1
    30. End Sub
    31. Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    32. Me.seitenNummer = 0
    33. End Sub
    34. Private Sub btnDrucken_Click(sender As Object, e As EventArgs) Handles btnDrucken.Click
    35. Using dlg As New PrintPreviewDialog
    36. dlg.Document = PrintDocument1
    37. dlg.WindowState = FormWindowState.Maximized
    38. dlg.ShowDialog(Me)
    39. End Using
    40. End Sub
    41. End Class
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Wo mache ich den Fehler?
    Zunächst sollte das zu druckende Dokument bei Druckstart bekannt sein, d.h., dieser Code

    VB.NET-Quellcode

    1. For i = 0 To 10
    2. stringToPrint2.Add("Zeile Nr: " & i)
    3. Next
    gehört nicht in die Print-Routine.
    Ich vermisse eine Seiten-Logik.
    Was soll denn beim Ausdruck passieren, wie soll der Ausdruck aussehen?
    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 diente jetzt nur für mich damit ich verstehe welche Möglichkeiten es gibt zu drucken.

    In Post#8 habe ich doch einen Screenshot beigefügt wie es aussehen soll.
    Und in Post#1 halt den Code dazu.
    Was genau vermisst Du da?



    So sieht mein Code jetzt aus.
    Wenn ich die Bindingsource nach Datum Filter, werden auch die entsprechend benötigten seiten generiert.
    Allerdings immer der gleiche Inhalt, da die PrintPage Routine ja immer wieder neu durchlaufen wird.
    Da hakt es bei mir noch.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Imports Hartmann_Statistik.HartmannDts
    3. Public Class dlgDruckenMonatsStatistik
    4. 'Private rwPlan As PlanRow
    5. 'Private rwVertriebler As VertriebmitarbeiterRow
    6. Private seitenZaehler As Integer = 0
    7. Private benötigteSeitenzahl As Integer
    8. Private Sub dlgDruckenMonatsStatistik_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. ppc.Document = PrintDocument1
    10. PrintDocument1.DefaultPageSettings.Landscape = True
    11. ppc.Zoom = 0.8
    12. For Each drucker As String In PrinterSettings.InstalledPrinters
    13. cboDrucker.Items.Add(drucker.ToString)
    14. Next
    15. cboDrucker.Text = PrintDocument1.PrinterSettings.PrinterName
    16. seitenzahlberechnen()
    17. End Sub
    18. Private Sub seitenzahlberechnen()
    19. Dim planCount As Integer = PlanBindingSource.Count - 1
    20. Dim zeilenProSeite As Integer = 20
    21. benötigteSeitenzahl = CInt(Math.Round(planCount / zeilenProSeite))
    22. 'MessageBox.Show("Berechnete Seiten: " & benötigteSeitenzahl.ToString & Environment.NewLine & "Gezählte Pläne: " & PlanBindingSource.Count - 1)
    23. End Sub
    24. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    25. '
    26. 'TODO Druck mehrseitig gestalten
    27. '
    28. Dim g = e.Graphics
    29. Dim _font = New Font("Segoe UI", 10)
    30. Dim _fontBold = New Font("Segoe UI", 10, FontStyle.Bold)
    31. Dim _fontHead = New Font("Segoe UI", 12)
    32. Dim _fontSmall = New Font("Segoe UI", 8)
    33. Dim _Brush = Brushes.Black
    34. Dim x As Single = e.MarginBounds.Left
    35. Dim y As Single = e.MarginBounds.Top
    36. Dim LineHeight As Single = _font.GetHeight(e.Graphics)
    37. Dim logo As Bitmap = My.Resources.LogoAGH
    38. PrintDocument1.DocumentName = "Hartmann Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString
    39. g.DrawImage(logo, x + 900, y - 70, 130, 40)
    40. g.DrawString("Hygienepläne ...", _fontHead, _Brush, x - 70, y - 70)
    41. g.DrawString("Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString, _font, _Brush, x - 70, y - 40)
    42. g.DrawString("Nr", _fontBold, _Brush, x - 70, y + 10)
    43. g.DrawString("Einstelldatum", _fontBold, _Brush, x - 40, y + 10)
    44. g.DrawString("Einrichtung", _fontBold, _Brush, x + 80, y + 10)
    45. g.DrawString("Bemerkung", _fontBold, _Brush, x + 390, y + 10)
    46. g.DrawString("Uploaddatum", _fontBold, _Brush, x + 810, y + 10)
    47. g.DrawString("VertriebMA", _fontBold, _Brush, x + 920, y + 10)
    48. g.DrawLine(Pens.Black, x - 70, y + 30, x + 1030, y + 30)
    49. For i = 0 To PlanBindingSource.Count - 1
    50. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    51. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    52. If rwPlan.berechnen = True Then
    53. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    54. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    55. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    56. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    57. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    58. If Not rwVertriebler Is Nothing Then
    59. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    60. Else
    61. g.DrawString("keiner", _font, _Brush, x + 920, y + 40)
    62. End If
    63. y += LineHeight + 10
    64. End If
    65. Next
    66. g.DrawString("gedruckt am " & Date.Today.ToShortDateString & " um: " & DateTime.Now.ToShortTimeString, _fontSmall, _Brush, New Point(980, 800))
    67. g.DrawString(String.Format("Seite {0}", seitenZaehler), _fontSmall, _Brush, New Point(20, 800))
    68. If seitenZaehler < benötigteSeitenzahl Then
    69. e.HasMorePages = True
    70. ppc.Rows = 6
    71. seitenZaehler += 1
    72. Else
    73. e.HasMorePages = False
    74. seitenZaehler = 0
    75. End If
    76. End Sub
    77. Private Sub btnDrucken_Click(sender As Object, e As EventArgs) Handles btnDrucken.Click
    78. PrintDocument1.Print()
    79. End Sub
    80. Private Sub dtpDrucken_CloseUp(sender As Object, e As EventArgs) Handles dtpDruckenVon.CloseUp, dtpDruckenBis.CloseUp
    81. PlanBindingSource.FilterX("Uploaddatum >= ? AND Uploaddatum <= ? ", dtpDruckenVon.Value, dtpDruckenBis.Value)
    82. ppc.InvalidatePreview()
    83. seitenzahlberechnen()
    84. End Sub
    85. Private Sub pnlDrucken_Paint(sender As Object, e As PaintEventArgs) Handles pnlDrucken.Paint
    86. e.Graphics.DrawLine(Pens.Black, pnlDrucken.Width - 1, 0, pnlDrucken.Width - 1, pnlDrucken.Height)
    87. End Sub
    88. Private Sub nudExemplare_ValueChanged(sender As Object, e As EventArgs) Handles nudExemplare.ValueChanged
    89. PrintDocument1.PrinterSettings.Copies = CShort(nudExemplare.Value)
    90. End Sub
    91. Private Sub cb_Drucken_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboDrucker.SelectedIndexChanged
    92. PrintDocument1.PrinterSettings.PrinterName = cboDrucker.SelectedItem.ToString
    93. ppc.Invalidate()
    94. End Sub
    95. Private Sub Zoom_Click(sender As Object, e As EventArgs) Handles btnZoomPlus.Click, btnZoomMinus.Click
    96. Select Case True
    97. Case sender Is btnZoomPlus : ppc.Zoom += 0.2
    98. Case sender Is btnZoomMinus : ppc.Zoom -= 0.2
    99. End Select
    100. End Sub
    101. End Class


    Doppelpost zusammengefügt. Nächstes Mal bitte die „Bearbeiten“-Funktion verwenden! ~Thunderbolt

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

    @Akanel Ich habe keine Lust, ein Projekt zu erstellen und an Deinen Code anzupassen (Button-Namen, PrintPreviewDialog ...).
    Poste mal ein bereinigtes Projekt ohne Schnickschnack, das ich starten kann.
    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
    Anbei ein lauffähiges Projekt.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

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

    @Akanel Offensichtlich hast Du meinen Beitrag zum Drucken mehrerer Seiten weder gelesen noch verstanden.
    Wie Dein Ausdruck aussehen soll, hast Du immer noch nicht beschrieben. X(
    Ich nehme mal an, dass auf Seite 2 die Fortsetzung von Seite 1 stehen soll usw.
    Wenn Du eine Variable hast, die die Anzahl der Zeilen pro Seite beschreibst, verwende sie auch, um die Anzahl der Zeilen pro Seite zu begrenzen.
    Die Aussage, dass der Druck beendet werden kann, hängt nicht an der Anzahl der gedruckten Seiten, sondern an der Anzahl der gedruckten Zeilen.
    Die Initialisierung der Druckvariablen für einen mehrseitigen Druck erfolgt im BeginPrint-Event.
    Die Seitenzählung beginnt mit Seite 1, passe den Scrollbereich entsprechend an.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim zeilenProSeite As Integer = 20
    2. Dim actLine As Integer
    3. Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    4. actLine = 0
    5. seitenZaehler = 0
    6. End Sub
    7. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    8. '
    9. 'TODO Druck mehrseitig gestalten
    10. '
    11. Dim g = e.Graphics
    12. Dim _font = New Font("Segoe UI", 10)
    13. Dim _fontBold = New Font("Segoe UI", 10, FontStyle.Bold)
    14. Dim _fontHead = New Font("Segoe UI", 12)
    15. Dim _fontSmall = New Font("Segoe UI", 8)
    16. Dim _Brush = Brushes.Black
    17. Dim x As Single = e.MarginBounds.Left
    18. Dim y As Single = e.MarginBounds.Top
    19. Dim LineHeight As Single = _font.GetHeight(e.Graphics)
    20. Dim logo As Bitmap = My.Resources.LogoAGH
    21. PrintDocument1.DocumentName = "Hartmann Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString
    22. g.DrawImage(logo, x + 900, y - 70, 130, 40)
    23. g.DrawString("Hygienepläne ...", _fontHead, _Brush, x - 70, y - 70)
    24. g.DrawString("Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString, _font, _Brush, x - 70, y - 40)
    25. g.DrawString("Nr", _fontBold, _Brush, x - 70, y + 10)
    26. g.DrawString("Einstelldatum", _fontBold, _Brush, x - 40, y + 10)
    27. g.DrawString("Einrichtung", _fontBold, _Brush, x + 80, y + 10)
    28. g.DrawString("Bemerkung", _fontBold, _Brush, x + 390, y + 10)
    29. g.DrawString("Uploaddatum", _fontBold, _Brush, x + 810, y + 10)
    30. g.DrawString("VertriebMA", _fontBold, _Brush, x + 920, y + 10)
    31. g.DrawLine(Pens.Black, x - 70, y + 30, x + 1030, y + 30)
    32. Dim printedLines = 0
    33. 'For i = 0 To PlanBindingSource.Count - 1
    34. For i = actLine To actLine + zeilenProSeite - 1
    35. If i >= PlanBindingSource.Count - 1 Then
    36. Exit For
    37. End If
    38. printedLines += 1
    39. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    40. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    41. If rwPlan.berechnen = True Then
    42. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    43. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    44. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    45. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    46. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    47. If Not rwVertriebler Is Nothing Then
    48. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    49. Else
    50. g.DrawString("keiner", _font, _Brush, x + 920, y + 40)
    51. End If
    52. y += LineHeight + 10
    53. End If
    54. Next
    55. actLine += printedLines
    56. g.DrawString("gedruckt am " & Date.Today.ToShortDateString & " um: " & DateTime.Now.ToShortTimeString, _fontSmall, _Brush, New Point(980, 800))
    57. g.DrawString(String.Format("Seite {0}", seitenZaehler + 1), _fontSmall, _Brush, New Point(20, 800))
    58. If seitenZaehler < benötigteSeitenzahl Then
    59. e.HasMorePages = True
    60. ppc.Rows = 6
    61. seitenZaehler += 1
    62. Else
    63. e.HasMorePages = False
    64. End If
    65. If actLine >= PlanBindingSource.Count - 1 Then
    66. e.HasMorePages = False
    67. End If
    68. End Sub
    Die Fonts kannst Du in der Klasse vorab berechnen / bereitstellen, die sind ja immer dieselben.
    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
    Erstmal vielen Dank für deine Mühe und auch Geduld.
    Ich habe Dein Tutorial sehr wohl gelesen, aber leider noch nicht verstanden. Da stimme ich Dir zu.
    Ich werde mir nun Deine Änderungen aus dem Code rauspicken und das ganze in einem externen Projekt nachbauen um zu verstehen was wann wie passiert.
    Mir war/ist zum Beispiel nicht klar wie ich die Schleife so unterbrechen kann das sie beim nächsten Durchlauf mit der richtigen Zeile weitermacht.
    In deinem Tutorial druckst Du kompletten Text, wo Du mit .substring arbeitest. Darauf ,und auf MeasureString, hatte ich mich fest gebissen und habe versucht das Umzusetzen. Wie man nun sieht lag ich komplett falsch.

    RodFromGermany schrieb:

    Wie Dein Ausdruck aussehen soll, hast Du immer noch nicht beschrieben.
    Ich nehme mal an, dass auf Seite 2 die Fortsetzung von Seite 1 stehen soll usw.

    Doch das habe ich in Post#1. Ist das nicht gleichwertig mit Deiner Aussage?

    Akanel schrieb:

    wie ich es hinbekomme das diese Tabelle , wenn nötig, auf 2 Seiten gedruckt werden kann




    RodFromGermany schrieb:

    passe den Scrollbereich entsprechend an.

    Ich denke damit meinst Du das PrintPreviewControl,richtig!? Da habe ich die Rows auf die benötigten Seiten angepasst.

    VB.NET-Quellcode

    1. ​ppc.rows = benoetigteSeiten


    Beim ersten Probedruck ist mir aufgefallen das die ersten beiden Seiten jeweils 23 Zeilen enthalten ( so wie im Code vorgesehen) allerdings werden auf Seite 3 nur 15 Zeilen gedruckt.
    Haltepunkt in die Schleife und nachgesehen was passiert.
    Er wird korrekt bis 23 gezählt und dann wird auf die nächste Seite gewechselt, nur ausgedruckt wird es nicht korrekt. ?(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class dlgDruckenMonatsStatistik
    2. Private seitenZaehler As Integer
    3. Private benoetigteSeitenzahl As Integer
    4. Private actLine As Integer
    5. Private zeilenProSeite As Integer = 20
    6. Private _font As New Font("Segoe UI", 10)
    7. Private _fontBold As New Font("Segoe UI", 10, FontStyle.Bold)
    8. Private _fontHead As New Font("Segoe UI", 12)
    9. Private _fontSmall As New Font("Segoe UI", 8)
    10. Private _Brush As Brush = Brushes.Black
    11. Private LineHeight As Single = Me._font.GetHeight
    12. Private logo As Bitmap = My.Resources.LogoAGH
    13. Private Sub dlgDruckenMonatsStatistik_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. ppc.Document = PrintDocument1
    15. PrintDocument1.DefaultPageSettings.Landscape = True
    16. 'ppc.Zoom = 0.8
    17. ppc.AutoZoom = True
    18. For Each drucker As String In PrinterSettings.InstalledPrinters
    19. cboDrucker.Items.Add(drucker.ToString)
    20. Next
    21. cboDrucker.Text = PrintDocument1.PrinterSettings.PrinterName
    22. seitenzahlberechnen()
    23. End Sub
    24. Private Sub seitenzahlberechnen()
    25. Dim planCount As Integer = PlanBindingSource.Count - 1
    26. benoetigteSeitenzahl = CInt(Math.Round(planCount / zeilenProSeite))
    27. End Sub
    28. Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    29. actLine = 0
    30. seitenZaehler = 1
    31. End Sub
    32. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    33. '
    34. 'TODO Druck mehrseitig gestalten
    35. '
    36. Dim g = e.Graphics
    37. Dim x As Single = e.MarginBounds.Left
    38. Dim y As Single = e.MarginBounds.Top
    39. PrintDocument1.DocumentName = "Hartmann Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString
    40. g.DrawImage(logo, x + 900, y - 70, 130, 40)
    41. g.DrawString("Hygienepläne ...", _fontHead, _Brush, x - 70, y - 70)
    42. g.DrawString("Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString, _font, _Brush, x - 70, y - 40)
    43. g.DrawString("Nr", _fontBold, _Brush, x - 70, y + 10)
    44. g.DrawString("Einstelldatum", _fontBold, _Brush, x - 40, y + 10)
    45. g.DrawString("Einrichtung", _fontBold, _Brush, x + 80, y + 10)
    46. g.DrawString("Bemerkung", _fontBold, _Brush, x + 390, y + 10)
    47. g.DrawString("Uploaddatum", _fontBold, _Brush, x + 810, y + 10)
    48. g.DrawString("VertriebMA", _fontBold, _Brush, x + 920, y + 10)
    49. g.DrawLine(Pens.Black, x - 70, y + 30, x + 1030, y + 30)
    50. Dim printedLines = 0
    51. For i = actLine To actLine + zeilenProSeite - 1
    52. If i >= PlanBindingSource.Count - 1 Then
    53. Exit For
    54. End If
    55. printedLines += 1
    56. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    57. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    58. If rwPlan.berechnen = True Then
    59. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    60. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    61. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    62. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    63. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    64. If Not rwVertriebler Is Nothing Then
    65. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    66. Else
    67. g.DrawString("keiner", _font, _Brush, x + 920, y + 40)
    68. End If
    69. y += LineHeight + 10
    70. End If
    71. Next
    72. actLine += printedLines
    73. g.DrawString("gedruckt am " & Date.Today.ToShortDateString & " um: " & DateTime.Now.ToShortTimeString, _fontSmall, _Brush, New Point(980, 800))
    74. g.DrawString(String.Format("Seite {0}", seitenZaehler), _fontSmall, _Brush, New Point(20, 800))
    75. If seitenZaehler < benoetigteSeitenzahl Then
    76. e.HasMorePages = True
    77. ppc.Rows = benoetigteSeitenzahl
    78. seitenZaehler += 1
    79. ElseIf actLine >= PlanBindingSource.Count - 1 Then
    80. e.HasMorePages = False
    81. End If
    82. 'If actLine >= PlanBindingSource.Count - 1 Then
    83. ' e.HasMorePages = False
    84. 'End If
    85. End Sub​
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Da habe ich die Rows auf die benötigten Seiten angepasst.
    Da musst Du aufpassen, was bei 0 und was bei 1 anfängt zu zählen.
    Ich habe nur dies in .PrintPage gefunden:

    VB.NET-Quellcode

    1. ppc.Rows = 6
    Richtig wäre dies:

    VB.NET-Quellcode

    1. Private Sub seitenzahlberechnen()
    2. Dim planCount As Integer = PlanBindingSource.Count - 1
    3. benötigteSeitenzahl = CInt(Math.Ceiling(planCount / zeilenProSeite))
    4. ppc.Rows = benötigteSeitenzahl
    5. 'MessageBox.Show("Berechnete Seiten: " & benötigteSeitenzahl.ToString & Environment.NewLine & "Gezählte Pläne: " & PlanBindingSource.Count - 1)
    6. End Sub
    Achte auf die Position des Thumbs:
    vorher
    nachher
    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:

    Ich habe nur dies in .PrintPage gefunden:


    Hattest Du Dir den Spoiler aus meinem letzten Post angesehen? Da habe ich das ppc.rows bereits geändert. Nur an einer anderen Stelle. (ziemlich weit unten)

    Allerdings habe ich noch nicht herausfinden können wieso auf einigen Seiten immer unterschiedlich viele Zeilen gedruckt werden.
    Jedes mal wenn ich den Zeitraum neu Filtere, ändert sich auch die anzahl der Zeilen auf einigen Seiten.

    Edit: Fehler eingegrenzt. Andere XML Datei geladen, und da funktioniert es.
    XML die bei deinem Projekt bei liegt funktioniert. Eine andere von mir die auch mit dem Programm erstellt wurde, funktioniert nicht. ?( :/
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

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

    Akanel schrieb:

    Da habe ich das ppc.rows bereits geändert
    Ich rede von dem von Dir angehängten Projekt.
    Vergleiche Druck-Zeilen-Index und DataSource-Index.
    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:

    Vergleiche Druck-Zeilen-Index und DataSource-Index.


    Ich verstehe ehrlich gesagt nicht was Du mir damit genau sagen möchtest.
    Ich habe die jetzt beide XML Dateien beim Debuggen komplett durchgesteppt und versucht einen Unterschied zu finden.
    Und ich habe keinen gefunden. Er wird wirklich jeder schritt ausgeführt, nur ausgedruckt wird es nicht korrekt.

    Druck-Zeilen-Index ist ja actLine bzw. printedLines für den aktuellen Durchlauf der Schleife und DataSource-Index ist aus meiner Sicht PlanBindingsource.count-1
    Das passt soweit alles.
    Die Schleife wird von der anzahl der aktuellen Zeile bis zur anzahle der aktuellen Zeile + ZeilenProSeite -1 durchlaufen.
    ZeilenProSeite habe ich zum testen auf 20 gesetzt.
    Mit jedem Durchlauf der Schleife wird printedLines um 1 erhöht bis die besagten 20 ZeilenProSeite erreicht sind.
    Die Schleife wird verlassen und der Wert von printedLines wird actLine(der aktuellen Zeile) aufaddiert.
    Der zweite Durchlauf startet nun mit 20 und geht bis 39. Wieder das selbe vorgehen wie oben beschrieben. Alles korrekt, der Code macht was er soll.
    Auf Seite 3 macht er dann scheinbar mal nicht was er soll. Die Schleife steppt bis 59 durch, aber gedruckt wird nur bis 55.
    Auf Seite 4 wird dann korrekter Weise wieder mit 60 gestartet. Sowohl die Schleife beginnt dort korrekt als auch der Ausdruck geht da wieder korrekt weiter.

    Wenn ich nun die BindingSource mit den DateTimePickern filtere, wird teilweise das Verhalten noch komischer. Dann sind bei zb. 3 zu druckenden Seiten alle durcheinander. Keine der Seiten erhält 20 Zeilen.

    Akanel schrieb:

    Und ich habe keinen gefunden.
    mein Code funktioniert aber.
    Ich empfehle Dir WinMerge, ein Zool zum Vergleich und Abgleich von Quellcoden.
    Du hast einen Zeilenindex, die wievielte Zeile der Seite gerade gedruckt wird. Dieser läuft stets von 0 bis 19.
    Du hast einen DataSource-Index, welche Zeile der Tabelle gerade gedruckt wird. Dieser läuft glatt durch.
    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:

    mein Code funktioniert aber.

    Ich habe nichts anderes gesagt. Natürlich funktioniert er, nur scheine ich noch ein anderes Problem zu haben welches ich nicht finde.

    Ich habe das Projekt mal mit 2 verschiedenen XML Dateien probiert. Mit der _test.xml funktioniert alles einwandfrei, bei der anderen tauchen oben beschriebene Probleme auf.

    Daraufhin hattest du mir WinMerge empfohlen. Beide Dateien mal verglichen, außer der Inhalte kein Unterschied.
    Ich finde den Fehler einfach nicht.
    Dateien
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @Akanel Missverständniss.
    Ich meinte die Unterschiede im Code von Dir und mir,
    Du meintest wohl die Unterschiede in zwei Daten-Dateien.
    Frage:
    Hast Du nun grundsätzlich funktionierenden Code?
    was läuft / läuft nicht bei den beiden Dateien?
    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

    Ja, dank Deiner Hilfe habe ich funktionierenden Code.
    Damit Du nicht alles zusammenbasteln musst hab ich wieder das aktuelle Projekt angehangen.
    Im Debug-Ordner liegen 2 .xml Files, mit denen ich getestet habe.

    Mit "HartmannStatistik.xml" funktioniert alles wie gewünscht. Es werden 20 Zeilen pro Seite gedruckt, egal wie viele Seiten zu drucken sind, nur die letzte Seite hat natürlich keine 20 Zeilen mehr.
    Wenn ich dort nun den Zeitraum eingrenze (via DateTimePicker), wird auch alles korrekt gedruckt.

    Mit "HartmannStatistik_original" funktioniert wiederum nichts so wie es soll. Die ersten 2 Seiten werden mit jeweils 20 Zeilen gedruckt, Seite 3 hat dann plötzlich nur 15 Zeilen und ab Seite 4 ist wieder alles ok.
    Wenn ich hier nun den Zeitraum eingrenze, hat KEINE Seite mehr 20 Zeilen, da ist es dann so das jede Seite unterschiedlich viele Zeilen hat.

    Da es mit der ersten .xml Datei funktioniert, kann es nicht am Code selbst liegen. Wie gesagt, der funktioniert Tadellos.
    Deshalb bin ich der Meinung, das Problem müsste an den .xml Dateien liegen.
    Dateien
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @Akanel Dies hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For i = actLine To actLine + zeilenProSeite - 1
    2. Debug.WriteLine(String.Format("Zeile {0} auf Seite {1}", i + 1, seitenZaehler))
    3. If i >= PlanBindingSource.Count - 1 Then
    4. Exit For
    5. End If
    6. printedLines += 1
    7. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    8. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    9. If rwPlan.berechnen = True Then
    10. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    11. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    12. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    13. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    14. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    15. If Not rwVertriebler Is Nothing Then
    16. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    17. Else
    18. g.DrawString("keiner", _font, _Brush, x + 920, y + 40)
    19. End If
    20. y += LineHeight + 10
    21. Else
    22. ' ##########################################
    23. ' ##########################################
    24. ' ##########################################
    25. ' dies hier
    26. g.DrawString("nicht berechnet", _font, _Brush, x - 70, y + 40)
    27. y += LineHeight + 10
    28. ' ##########################################
    29. ' ##########################################
    30. ' ##########################################
    31. End If
    32. Next

    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!
    Wow das ging ja schnell.
    Ja da war der Fehler. Dadurch hast Du mir dann auch gezeigt das mein Ansatz nicht der richtige war.
    Denn es sollen ja nur die Datensätze gedruckt werden, wo die Spalte "berechnen = True" ist.
    Da ich die Bindingsource vorher nicht filtere, werden demnach alle Datensätze berücksichtigt, aber in der Druckroutine habe ich ihn nicht beachtet. :/

    Edit:
    Und da taucht schon das nächste Problem auf, da ich die Bindingsource ja mittels der DateTimePicker filtere, kann ich ja nicht noch einen Filter einbauen. Die heben sich je gegenseitig auf. ?(
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

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