Drucken des Inhalts eines Datagridview / Dataset über mehrere Seiten in VB Net

  • VB.NET
  • .NET 4.5

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

    Drucken des Inhalts eines Datagridview / Dataset über mehrere Seiten in VB Net

    Hallo liebe User im Forum,

    ich arbeite gerade in VB net an einem Programm, welches ich zur Erstellung von Angeboten nutzen möchte.
    Das Programm funzt auch soweit (Kalkulation, etc.). Nun will ich das Angebot gern ausrcuekn in Form einer mehrseitigen PDF.
    Dazu habe ich mir den Beitrag von RodFormGermany (Drucken mehrseitiger Dokumente) auch schon angeschaut. Allerdings versteh ich nicht, wie ich die Zeilenanzahl über die einzufügenden Zeilen aus dem Datagrdiview zählen kann.

    Mein Problem liegt darin, das ich als Quelle meiner Strings nicht eine Richtextxbox habe, sondern ein Datagridview.
    Der Aufbau sieht folgendermaßen aus:

    Über Controls wie ComboBox, TextBox, etc. wird eine Auswahl getroffen. Die Auswahl wird in ein gebundenes DataSet geschrieben. Das DataSet ist als DataSocurce an ein Datagridview gebunden, über das ich den Angebotsinhalt einsehen kann. Diesen Inhalt möchte ich nun inklusive einer Kopf- und Fußzeile ausdrucken. Der Ausdruck an sich funzt auch, allerdings bekomme ich immer nur eine Seite hin. Die weiteren Seiten werden nicht angezeigt.
    Ich rufe über einen Button den Printpreview-Dialog auf, der zeigt mir immer nur eine Seite an. Irgendwie schaffe ich es nicht, das Datagridview per Schleife zu durchlaufen und bis zum Seitenende zu zählen, damit eine neue Seite generiert wird. Das Datagridview durchlaufe ich mit einer For Schleife. Das klappt auch alles. Leider scheitert es daran, das das Seitenende nicht erkannt wird.
    Hab auch schon versucht, den "Zähler CurrentRecord" anzupassen, aber dann läuft beim erzeugen der Ansicht im Preview-Dialog der Zähler weiter und weiter und weiter.

    Bin mir nicht sicher, ob das verständlich rüber kam. Will eigentlich eine mehrseitige PDF erzeugen, die eine Kopfzeile, den Angebotsinhalt (aus dem Datagridview) sowie eine Fußzeile hat. Im Moment klappts zwar mit der Kopfzeile, aber dann hänge ich beim Angebotsinhalt des Datagridview auf Seite 1. Eine weitere Seite wird nicht erzeugt.
    In der PrintPreview-Ansicht wird die letzte Zeile am Seitenrand unten angezeigt, was ich nicht verstehe. Die nächste Seite wird einfach nicht erzeugt.

    Hat jemand ne Idee und kann mir vielleicht einen Denkansatz geben? Bin nun seit einer Woche dadran und komme nicht weiter. Hab schon gegoogelt, mehrfach Sachen ausprobiert, nichts bringt mich weiter. Das Beispiel von RodFromGermany bezieht sich auf eine Richtextbox, leider weiß ich nicht wie ich das auf mein Datagridview anwenden kann.
    Hier mal mein Code.

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim g = e.Graphics
    3. Dim pen1 As New Pen(Brushes.Black, 0.5)
    4. 'Die Kopfzeilen zum Angebot
    5. Dim xAngebotstitel As Integer = CurrentX 'Kopfzeile - Zeile 1
    6. Dim xAngebotstitel2 As Integer = CurrentX 'Kopfzeile - Zeile 2
    7. Dim Currentrecord As Integer = 0
    8. Dim Recordsperpage As Integer = 20
    9. Dim pos As String
    10. Dim element As String
    11. Dim beschreibung As String
    12. Dim dicke As String
    13. Dim länge As String
    14. Dim stück As String
    15. Dim menge As String
    16. Dim ep As String
    17. Dim gp As String
    18. Dim mwst As Double
    19. Dim netto As Double
    20. Dim brutto As Double
    21. Dim fntText As Font = New Font("Calibri", 11, FontStyle.Regular)
    22. Dim margin = Me.PrintDocument1.DefaultPageSettings.Margins
    23. leftmargin = margin.Left
    24. rightMargin = margin.Right
    25. topmargin = margin.Top
    26. bottomMargin = margin.Bottom
    27. Angebotsbreite = margin.Left - margin.Right
    28. AngebotsHeight = margin.Top - margin.Bottom
    29. PrintDocument1.DocumentName = Label64.Text
    30. Kopfzeile1 = "Angebot an " & tbkunde.Text & " - vom " & Date.Now.ToShortDateString
    31. If tbanfragenummer.Text = "" Then
    32. Kopfzeile2 = "BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
    33. ElseIf tbanfragenummer.Text = "" And tbkommission.Text = "" Then
    34. Kopfzeile2 = "BV in " + tbplz1.Text + " " + tblieferort.Text
    35. ElseIf tbkommission.Text = "" Then
    36. Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV in " + tbplz1.Text + " " + tblieferort.Text
    37. Else
    38. Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
    39. End If
    40. Logo = "c:\users\" + Environment.UserName + "\desktop\Logo.jpg"
    41. CurrentX = leftMargin - 60
    42. CurrentY = topMargin
    43. If File.Exists(Logo) Then
    44. Dim ologo As Image = Image.FromFile(Logo)
    45. Dim bmp As New Bitmap(ologo, 180, 95)
    46. g.DrawImage(bmp, 600, 30)
    47. End If
    48. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    49. Subtitelschrifthöhe = Convert.ToInt32(Subtitelschrift.GetHeight(g))
    50. If (Kopfzeile1 <> "") Then
    51. CurrentY = CurrentY
    52. g.DrawString(Kopfzeile1, Angebotstitelschrift, Brushes.Black, CurrentX, CurrentY - 70)
    53. End If
    54. If (Kopfzeile2 <> "") Then
    55. CurrentY = CurrentY + Angebotstitelschrifthöhe
    56. g.DrawString(Kopfzeile2, Angebotstitelschrift, Brushes.Black, CurrentX, CurrentY - 65)
    57. End If
    58. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    59. 'Druckdaten zu Firma setzen
    60. CurrentX = leftMargin - 60
    61. CurrentY = CurrentY + 50
    62. 'Die Zeilen an den Kunden
    63. g.DrawString("Angebot an" & vbTab & vbTab & ": " & tbkunde.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 20)
    64. g.DrawString("Ansprechpartner" & vbTab & vbTab & ": " & tbansprech.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 40)
    65. g.DrawString("Anfragenummer" & vbTab & vbTab & ": " & tbanfragenummer.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 60)
    66. g.DrawString("PLZ / Lieferort" & vbTab & vbTab & ": " & tbplz1.Text & " / " & tblieferort.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 80)
    67. g.DrawString("BV / Kommission" & vbTab & vbTab & ": " & tbkommission.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 100)
    68. 'Die Zeilen für Verkauf und Innendienst
    69. Dim xverkauf As Integer = leftMargin + 350
    70. g.DrawString("Verkaufsleiter" & vbTab & ": " & cboVerkaufsleiter.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 20)
    71. g.DrawString("Tel." & vbTab & vbTab & ": " & tbtelA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 40)
    72. g.DrawString("Fax." & vbTab & vbTab & ": " & tbfaxA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 60)
    73. 'Angebotsdatum
    74. g.DrawString(Date.Now.ToShortDateString, fntText, Brushes.Black, xverkauf + 250, CurrentY + Angebotstitelschrifthöhe + 230)
    75. 'Angebotstext
    76. g.DrawString("Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf & "wir danken Ihnen für Ihre Anfrage und unterbreiten Ihnen unser für Sie kostenlos ausgearbeitetes Angebot wie folgt:", fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 250)
    77. 'Dim pen1 As Pen = New Pen(Brushes.Black, 0.8)
    78. Dim mybrush As SolidBrush = New SolidBrush(Color.LightGray)
    79. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    80. CurrentY = topMargin + 400
    81. e.Graphics.FillRectangle(mybrush, leftMargin - 60, CurrentY, 750, 25)
    82. 'tbkunde.Text = Kundenangebot.Einzelangebot.Rows(0).Item("Firma").ToString
    83. 'Tabellenkopfzeilen
    84. CurrentX = leftMargin - 50
    85. Dim xPos As Integer = CurrentX + 5
    86. Dim XBeschreibung As Integer = xPos + 35
    87. Dim xLänge As Integer = XBeschreibung + 320
    88. Dim xStück As Integer = xLänge + 80
    89. Dim xMenge As Integer = xStück + 80
    90. Dim xEP As Integer = xMenge + 80
    91. Dim xGP As Integer = xEP + 70
    92. Dim ipos As Integer = 0
    93. Dim yPosinhalt As Integer = CurrentY + 30
    94. e.Graphics.DrawString("Pos.", fntText, Brushes.Black, CurrentX, CurrentY + 4)
    95. e.Graphics.DrawString("Beschreibung", fntText, Brushes.Black, XBeschreibung, CurrentY + 4)
    96. e.Graphics.DrawString("Länge", fntText, Brushes.Black, xLänge, CurrentY + 4)
    97. e.Graphics.DrawString("Stück", fntText, Brushes.Black, xStück, CurrentY + 4)
    98. e.Graphics.DrawString("Menge", fntText, Brushes.Black, xMenge, CurrentY + 4)
    99. e.Graphics.DrawString("EP (€)", fntText, Brushes.Black, xEP, CurrentY + 4)
    100. e.Graphics.DrawString("GP (€)", fntText, Brushes.Black, xGP, CurrentY + 4)
    101. ' Tabelleninhalt zeichnen
    102. CurrentY = CurrentY + Angebotstitelschrifthöhe + 20
    103. Dim intstart As Integer = 0
    104. Dim txtheight As Integer
    105. txtheight = PrintDocument1.DefaultPageSettings.PaperSize.Height - PrintDocument1.DefaultPageSettings.Margins.Top - PrintDocument1.DefaultPageSettings.Margins.Bottom
    106. Dim linesperpage As Integer = CInt(Math.Round(txtheight / (fntText.Height + 0.5)))
    107. 'e.Graphics.DrawRectangle(Pens.Red, e.MarginBounds)
    108. Dim i As Integer
    109. For i = 0 To DataGridView1.RowCount - 2
    110. netto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString)
    111. mwst = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("MwSt").ToString)
    112. brutto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Brutto").ToString)
    113. brutto = netto + mwst
    114. Dim j As Integer
    115. j += 10
    116. pos = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    117. element = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    118. dicke = Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString
    119. beschreibung = "Kerndicke" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString _
    120. & vbCrLf _
    121. & "Dämmkern" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Dämmkern").ToString & vbCrLf _
    122. & "U-Wert" & vbTab & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("U-Wert").ToString & " W/m²K" & vbCrLf _
    123. & "Stahldicke (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Stahldicke (A/I)").ToString & vbCrLf _
    124. & "Profilierung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Profilierung (A/I)").ToString & vbCrLf _
    125. & "Beschichtung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Beschichtung (A/I)").ToString & vbCrLf _
    126. & "Farbton (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Farbton (A/I)").ToString
    127. länge = Kundenangebot.Einzelangebot.Rows(i).Item("Länge").ToString
    128. stück = Kundenangebot.Einzelangebot.Rows(i).Item("Stück").ToString
    129. menge = Kundenangebot.Einzelangebot.Rows(i).Item("Menge").ToString
    130. ep = Kundenangebot.Einzelangebot.Rows(i).Item("Preis (inkl. Fracht)").ToString
    131. gp = Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString
    132. element = Kundenangebot.Einzelangebot.Rows(i).Item("Anwendung").ToString & " " & Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    133. g.DrawString(CStr(j), fntText, Brushes.Black, xPos, CurrentY) 'Pos
    134. g.DrawString(element, fntText, Brushes.Black, XBeschreibung, CurrentY) 'Element
    135. g.DrawString(beschreibung, fntText, Brushes.Black, XBeschreibung, CurrentY + 20)
    136. g.DrawString(länge, fntText, Brushes.Black, xLänge, CurrentY) 'Länge
    137. g.DrawString(stück, fntText, Brushes.Black, xStück, CurrentY) 'Stück
    138. g.DrawString(menge, fntText, Brushes.Black, xMenge, CurrentY) 'Menge
    139. g.DrawString(ep, fntText, Brushes.Black, xEP, CurrentY) 'EP
    140. g.DrawString(gp, fntText, Brushes.Black, xGP, CurrentY) 'GP
    141. CurrentY = CurrentY + Angebotstitelschrifthöhe + 150
    142. g.DrawLine(pen1, CurrentX, CurrentY - 10, CurrentX + 730, CurrentY - 10)
    143. g.DrawString(String.Format(" - Seite {0} -", pageNb + 1), fntText, Brushes.Black, 380, 1120)
    144. Currentrecord += 1
    145. Next
    146. If Currentrecord < Recordsperpage Then
    147. e.HasMorePages = False
    148. Else
    149. e.HasMorePages = True
    150. End If
    151. CurrentY = CurrentY + 20
    152. Dim xPos1 As Integer = leftMargin + 550
    153. Dim i1 As Integer
    154. Dim netto1 As Double
    155. Dim mwst1 As Double
    156. Dim brutto1 As Double
    157. For i1 = 0 To DataGridView1.Rows.Count - 2
    158. netto1 += CDbl(DataGridView1.Rows(i1).Cells(14).Value)
    159. Next
    160. mwst1 = netto * 0.19
    161. brutto1 = netto + mwst
    162. lblgesamtnetto.Text = Format(netto, "#,##.00")
    163. lblgesamtmwst.Text = Format(mwst, "#,##.00")
    164. lblgesamtbrutto.Text = Format(brutto, "#,##.00")
    165. g.DrawString("Netto", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY)
    166. g.DrawString(lblgesamtnetto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY)
    167. g.DrawString("MwSt", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 20)
    168. g.DrawString(lblgesamtmwst.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY + 20)
    169. g.DrawString("Brutto", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 40)
    170. g.DrawString(lblgesamtbrutto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY + 40)
    171. End Sub[vbnet]
    Du hast ein Dataset? Ein typisiertes?
    Dann hast du doch bestimmt auch eine Bindungsource. Hol dir die Daten dann aus der Bindungsource statt aus dem Datagrieview.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hi

    ja, ein typisiertes Dataset. Ich hole mir die Daten aus dem Dataset. Das Datagridview nehme ich nur zum anzeigen der Datensätze.
    Die Datensätze aus dem Datagridview zu holen ist ja ncht so das Problem, aber wie hole ich die aus der Binding Source? Und ne For Schleife brauche ich ja auch, damit ich alle Rows durchlaufe bis die letzte erreicht ist.

    silverbob76GE schrieb:

    ja, ein typisiertes Dataset.
    Find ich super!

    silverbob76GE schrieb:

    Ich hole mir die Daten aus dem Dataset. Das Datagridview nehme ich nur zum anzeigen der Datensätze.
    So soll's sein, gut!

    silverbob76GE schrieb:

    Die Datensätze aus dem Datagridview zu holen ist ja ncht so das Problem
    Eh ... na wat denn nu? Verwendest Du es jetzt nur zur Anzeige oder doch für was anderes?

    silverbob76GE schrieb:

    aber wie hole ich die aus der Binding Source?
    Ich erinnere mich da an ne Liedzeile: »Bin weit gekommen, doch was soll ich hier?«
    Dann hast Du wahrscheinlich Dein Wissen nicht von EdRs VVV-Tutorial, oder? Da gibt's den berühmten Doppel-Cast: Dim CurrentTypedRow = DirectCast(DirectCast(YourBindingSource.Current, DataRowView).Row, YourTds.YourDataTableRow)
    Ich wurschtel mich jetzt nicht durch Deinen Code, aber wenn Dein DataSet Tds heißt, Deine Kundentabelle Customers und Deine entsprechende BindingSource BsCustomers, dann würde die Zeile z.B. lauten:

    VB.NET-Quellcode

    1. Dim CurrentCustomersRow = DirectCast(DirectCast(BsCustomers.Current, DataRowView).Row, Tds.CustomersRow)
    Und schwupps! Hast Du sogar typisierten Zugriff auf alle CustomersRow-Spalten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    Danke für deine Antwort, VaporiZed. Das Tut von EdR habe ich mir mehrfach angeschaut, einige Lücken sind noch da. Bin halt noch newbie, würd ich einfach mal behaupten.

    Die Daten aus dem Datagrid zu holen klappt, das habe ich ja schon probiert. Nur scheiters dann an der For Schleife bzw. daran, das das Seitenende nicht erkannt wird, um eine neue Siete zu generieren
    Wenns denn mit der Bindingsource eher klappt, werd ich das mal angehen. Ist auf jeden Fall die elgeantere Lösung, aber war mir nicht sicher ob das bei der Generierung der PDF vorteilhafter ist.

    Edit:
    Das Problem liegt nicht darin, das ich die Datensätze nicht aus dem DatagridView holen und dann drucken kann. Das klappt.
    Weiß auch gerade nicht, wie ich mit ner For Schleife durch die BindingSource durchlaufe, um dann die entsprechenden Daten zu drucken.

    Ich hänge eher an der Stelle, das das PrintDoc-Event nicht erkennt, das das Seitenende erreicht ist und eine neue Seite generiert werden soll.
    Im aktuellen Abruf aus dem DatagridView habe ich vier Datensätze. Der vierte Datensatz wird zum Ende der Seite quasi abgebrochen, da die Zeilenanzahl größer ist als die restlichen Zeilen auf der Seite. Also wie bekomme ich es hin, das die For-Schleie erkennt, das der nächste Datensatz auf eine neue Seite muss?

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

    @silverbob76GE Das ist ein zweiteiliges Problem.
    • Wie drucke ich eine Tabelle?
    • Wie hole ich Daten in Tabellenform aus einem DataSet?
    Hast Du bereits beide Probleme einzeln und unabhängig voneinander gelöst? Dann setze die Lösungen einfach zusammen.
    Und:
    Wisse immer, wo Du gerade druckst, dann weist Du automatisch, wann Du einen Seitenvorschub einklinken musst.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Danke vorweg für deine Antwort.
    Ich drucke nicht alle Spalten des Dataset, die sind für mein Angebot nicht erforderlich. Die benötigten Spalten hole ich mir mittlerweile aus dem Dataset, nicht aus dem Datagridview. Das habe ich bereits angepasst. Aus den Spalten bastele ich quasi eine Tabelle zusammen. Die Spaltenüberschriften schreibe ich über den Wert CurrentX in die Tabellenzeile nebeneinander. Die zugehörigen Zeilenwerte zur passenden Spalte hole ich aus dem Dataset. Damit alle Positionen aus dem Dataset geschrieben werden, lasse ich das durch eine For-Schleife laufen.

    Ich komme aber nicht weiter, weil immer nur eine Seite gedruckt wird. Hab zwar ne If-Abfrage hinter der For-Schleife, aber irgendwie funzt die nicht, so das die For-Schleife die 4 Datensätze schreibt, aber kein Seitenumbruch stattfindet.

    Hier mal die For-Schleife. Irgendwo hab ich nen Denkfehler.

    Der Seitenaufbau soll wie folgt aussehen:
    1. Birefkopf mit Anschrift, etc. Soll nur aufer ersten Seite gedruckt werden
    2. Angebotspositionen. Sollen gedruckt werden, bis die For-Schleife das Ende des Datasets erreicht hat. Wenn Seitenende erreicht, sollen weitere Seiten hinzugefügt werden.
    3. Fixer text am Ende des Angebots soll hinzugefügt werden.
    Der Briefkopf wird gedruckt, der zweite Teil auch, allerdings werden keine weiteren Seiten generiert. Teil 3 würde wird auch gedruckt, wenn genügend Platz auf der Seite ist.

    ich hab versucht, die Zeilenanzahl auf 20 zu begrenzen, damit ich in der If-Abfrage feststellen kann, wann e.hasmorepages = true ist.
    Den Wert currentrecord erhöhe ich bei jedem Durchlauf um eins.


    VB.NET-Quellcode

    1. Dim linesperpage As Integer = CInt(Math.Round(txtheight / (fntText.Height + 0.5)))
    2. Dim i As Integer
    3. Dim currentrecord = 0
    4. Dim recorsperpage = 20
    5. For i = 0 To Kundenangebot.Einzelangebot.Rows.Count - 1
    6. netto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString)
    7. mwst = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("MwSt").ToString)
    8. brutto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Brutto").ToString)
    9. brutto = netto + mwst
    10. Dim j As Integer
    11. j += 10
    12. pos = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    13. element = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    14. dicke = Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString
    15. beschreibung = "Kerndicke" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString _
    16. & vbCrLf _
    17. & "Dämmkern" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Dämmkern").ToString & vbCrLf _
    18. & "U-Wert" & vbTab & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("U-Wert").ToString & " W/m²K" & vbCrLf _
    19. & "Stahldicke (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Stahldicke (A/I)").ToString & vbCrLf _
    20. & "Profilierung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Profilierung (A/I)").ToString & vbCrLf _
    21. & "Beschichtung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Beschichtung (A/I)").ToString & vbCrLf _
    22. & "Farbton (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Farbton (A/I)").ToString
    23. länge = Kundenangebot.Einzelangebot.Rows(i).Item("Länge").ToString
    24. stück = Kundenangebot.Einzelangebot.Rows(i).Item("Stück").ToString
    25. menge = Kundenangebot.Einzelangebot.Rows(i).Item("Menge").ToString
    26. ep = Kundenangebot.Einzelangebot.Rows(i).Item("Preis (inkl. Fracht)").ToString
    27. gp = Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString
    28. element = Kundenangebot.Einzelangebot.Rows(i).Item("Anwendung").ToString & " " & Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
    29. g.DrawString(CStr(j), fntText, Brushes.Black, xPos, CurrentY) 'Pos
    30. g.DrawString(element, fntText, Brushes.Black, XBeschreibung, CurrentY) 'Element
    31. g.DrawString(beschreibung, fntText, Brushes.Black, XBeschreibung, CurrentY + 20)
    32. g.DrawString(länge, fntText, Brushes.Black, xLänge, CurrentY) 'Länge
    33. g.DrawString(stück, fntText, Brushes.Black, xStück, CurrentY) 'Stück
    34. g.DrawString(menge, fntText, Brushes.Black, xMenge, CurrentY) 'Menge
    35. g.DrawString(ep, fntText, Brushes.Black, xEP, CurrentY) 'EP
    36. g.DrawString(gp, fntText, Brushes.Black, xGP, CurrentY) 'GP
    37. CurrentY = CurrentY + Angebotstitelschrifthöhe + 150
    38. g.DrawLine(pen1, CurrentX, CurrentY - 10, CurrentX + 730, CurrentY - 10)
    39. g.DrawString(String.Format(" - Seite {0} -", page + 1), fntText, Brushes.Black, 380, 1120)
    40. currentrecord + = 1
    41. If currentrecord < recordsperpage Then
    42. e.HasMorePages = False
    43. Else
    44. e.HasMorePages = True
    45. End If
    46. Next

    silverbob76GE schrieb:

    Aus den Spalten bastele ich quasi eine Tabelle zusammen.
    Dann mach da ne richtige DataTable draus und druck diese vollständig.
    Solch Konvertierungen sind da nicht erforderlich, in der Tabelle steht dann tatsächlich ein Double.

    VB.NET-Quellcode

    1. netto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString)
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hi Rod

    Das DataSet "Kundenangebot" hat eine DataTable "Einzelangebot". Die Spalte "Netto" habe ich nun in Double umgewandelt.
    Warum soll ich die DataTable komplett drucken? Ich brauche ja nur einen Teil der Infos im Angebot, nicht alle. Daher ziehe ich nur die Spalten raus, die ich brauche.
    Ich durchlaufe in der For Schleife das DataTable und hole mir die einzelnen Zellen einer Spalte, die ich für den Druck benötige.

    Alle anderen Spalten sind rein informativ für mich um zu verfolgen, welche Grundlage das Angebot hatte, einfach zum nachschlagen, sozusagen eine Übersicht was der Kunde wann angefragt hat und was die Grundlage für meine Kalkulation war.

    Allerdings muss ich immer noch wie folgt schreiben:

    VB.NET-Quellcode

    1. netto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Netto"))


    Sonst bekomme ich keinen Wert gedruckt.
    Du sagtest doch du hast ein typisiertes Dataset. Dein Zugriff scheint mir aber nicht typisiert. @VaporiZed hat dir doch den Doppelcast gezeigt. Damit geht alles einfacher.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ja, hab ein typsiertes DataSet. Weiß allerdings nicht wie ich den DirectCast einsetzen soll, um ehrlich zu sein. Habs auch nicht im TUT von EdR verstanden.

    Mein Problem liegt ja nicht darin, das ich keine Daten aus dem Dataset holen kann. Das klappt. Das Problem hängt beim Drucken.
    Wie hilft mir hier der DirectCast weiter?

    Entweder stehe ich voll auf dem Schlauch, oder ich konnte mein Problem nicht verständlich rüberbringen, oder beides ?
    @silverbob76GE Das sollte dann eigentlich so gehen:
    netto = Kundenangebot.Einzelangebot.Rows(i).Item("Netto")
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    hab ich probiert, aber bekomme dann ne Fehlermeldung => "Option strict on lässt keine Konvertierungen von Object in Double zu."
    Hab die Spalte als System.Double im DataTable angegeben.

    Edit: Der Druck der Spaltenübeschrift und auch der Zeile in dieser Spalte klappt ja.

    WIll eigentlich nur irgendiwe hinbekommen, das die Zeilen aus der DataTable auch auf mehreren Seiten gedruckt werden.
    Hab schon probiert mit:

    VB.NET-Quellcode

    1. If bottomMargin - 100 > CurrentY Then
    2. e.HasMorePages = False
    3. Else
    4. e.HasMorePages = True
    5. End If


    wobei Currenty als Integer die Koordinate der letzten Zeile angibt, die im Printpreviewdialog angezeigt wird. Leider zählt der Seitenzähler immer weiter und weiter, ohne Ende. Wenn ich dann auf Abbrechen klicke, wird nur eine Seite angezeigt.

    silverbob76GE schrieb:

    Fehlermeldung
    Dann stimmt Deine Aussage mit dem typisierten DataSet falsch.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Verstehe nicht was du meinst. Stimmt meine Aussage das ich den Zelleninhalt konvertieren muss, oder meinst du ich habe kein typsiertes Dataset? Kann nicht ganz folgen.

    Edit:

    hab jetzt den Rat von VaporiZed befolgt. Hab den doppelten Directcast angewendet. Funzt.

    Druckproblem bleibt. Eine zweite Seite wird nicht generiert. Der Zurgriff auf das Dataset mit DirectCast und damit auch auf die Spalten klappt, genausogut wie vorher auch.

    Wenn ich im PrintPreview-Dialog bin, wird mir die Seite bis ans Ende beschriftet. ich will aber, das bevor das Seitenende erreicht wird, eine neue Seite generiert wird. Anbei mal ein kleiner Screenshot zur Veranschaulichung.


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

    @Akanel

    Hi Akanel. Anbei der komplette Code aus PrintDocument-PrintPage

    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim g = e.Graphics
    3. Dim pen1 As New Pen(Brushes.Black, 0.5)
    4. Dim rc = g.VisibleClipBounds
    5. Dim margin = PrintDocument1.DefaultPageSettings.Margins
    6. margin.Left = 30
    7. margin.Right = 30
    8. margin.Top = 30
    9. margin.Bottom = 30
    10. leftMargin = margin.Left
    11. rightMargin = margin.Right
    12. topMargin = margin.Top
    13. bottomMargin = margin.Bottom
    14. rc.Offset(margin.Left, margin.Top)
    15. rc.Height -= margin.Top + margin.Bottom
    16. rc.Width -= margin.Left + margin.Right
    17. g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    18. 'Die Kopfzeilen zum Angebot
    19. Dim xAngebotstitel As Integer = CurrentX 'Kopfzeile - Zeile 1
    20. Dim xAngebotstitel2 As Integer = CurrentX 'Kopfzeile - Zeile 2
    21. Dim pos As String
    22. Dim element As String
    23. Dim beschreibung As String
    24. Dim dicke As String
    25. Dim länge As String
    26. Dim stück As String
    27. Dim menge As String
    28. Dim ep As String
    29. Dim gp As String
    30. Dim mwst As Decimal
    31. Dim netto As Decimal
    32. Dim brutto As Decimal
    33. Dim currentrecord As Integer = 0
    34. Dim recordsperpage As Integer = 20
    35. Dim fntText As Font = New Font("Calibri", 10, FontStyle.Regular)
    36. PrintDocument1.DocumentName = Label64.Text
    37. ' An dieser Stelle wird der Briefkopf erzeugt. Dieser soll nur auf der ersten Seite gedruckt werden.
    38. Kopfzeile1 = "Angebot an " & tbkunde.Text & " - vom " & Date.Now.ToShortDateString
    39. If tbanfragenummer.Text = "" Then
    40. Kopfzeile2 = "BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
    41. ElseIf tbanfragenummer.Text = "" And tbkommission.Text = "" Then
    42. Kopfzeile2 = "BV in " + tbplz1.Text + " " + tblieferort.Text
    43. ElseIf tbkommission.Text = "" Then
    44. Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV in " + tbplz1.Text + " " + tblieferort.Text
    45. Else
    46. Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
    47. End If
    48. Logo = "c:\users\" + Environment.UserName + "\desktop\Kingspan Logo.jpg"
    49. CurrentX = leftMargin
    50. CurrentY = topMargin
    51. If File.Exists(Logo) Then
    52. Dim ologo As Image = Image.FromFile(Logo)
    53. Dim bmp As New Bitmap(ologo, 180, 95)
    54. g.DrawImage(bmp, 600, margin.Top + 10)
    55. End If
    56. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    57. Subtitelschrifthöhe = Convert.ToInt32(Subtitelschrift.GetHeight(g))
    58. If (Kopfzeile1 <> "") Then
    59. CurrentY = CurrentY
    60. g.DrawString(Kopfzeile1, Angebotstitelschrift, Brushes.Black, CurrentX + 20, CurrentY + 50)
    61. End If
    62. If (Kopfzeile2 <> "") Then
    63. CurrentY = CurrentY + Angebotstitelschrifthöhe
    64. g.DrawString(Kopfzeile2, Angebotstitelschrift, Brushes.Black, CurrentX + 20, CurrentY + 55)
    65. End If
    66. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    67. 'Druckdaten zu Firma setzen
    68. CurrentX = leftMargin + 20
    69. CurrentY = CurrentY + 150
    70. 'Die Zeilen an den Kunden
    71. g.DrawString("Angebot an" & vbTab & vbTab & ": " & tbkunde.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 20)
    72. g.DrawString("Ansprechpartner" & vbTab & vbTab & ": " & tbansprech.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 40)
    73. g.DrawString("Anfragenummer" & vbTab & vbTab & ": " & tbanfragenummer.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 60)
    74. g.DrawString("PLZ / Lieferort" & vbTab & vbTab & ": " & tbplz1.Text & " / " & tblieferort.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 80)
    75. g.DrawString("BV / Kommission" & vbTab & vbTab & ": " & tbkommission.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 100)
    76. 'Die Zeilen für Verkauf und Innendienst
    77. Dim xverkauf As Integer = leftMargin + 450
    78. g.DrawString("Verkaufsleiter" & vbTab & ": " & cboVerkaufsleiter.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 20)
    79. g.DrawString("Tel." & vbTab & vbTab & ": " & tbtelA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 40)
    80. g.DrawString("Fax." & vbTab & vbTab & ": " & tbfaxA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 60)
    81. g.DrawString("E-Mail" & vbTab & vbTab & ": " & tbemailA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 80)
    82. g.DrawString("Mobil" & vbTab & vbTab & ": " & tbmobilA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 100)
    83. g.DrawString("Innendienst:" & vbTab & ": " & cboInnendienst.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 120)
    84. g.DrawString("Tel." & vbTab & vbTab & ": " & tbtelI.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 140)
    85. g.DrawString("Fax" & vbTab & vbTab & ": " & tbfaxI.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 160)
    86. g.DrawString("E-Mail" & vbTab & vbTab & ": " & tbemailI.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 180)
    87. 'Angebotsdatum
    88. g.DrawString(Date.Now.ToShortDateString, fntText, Brushes.Black, xverkauf + 220, CurrentY + Angebotstitelschrifthöhe + 230)
    89. 'Angebotstext
    90. g.DrawString("Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf & "wir danken Ihnen für Ihre Anfrage und unterbreiten Ihnen unser für Sie kostenlos ausgearbeitetes Angebot wie folgt:", fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 250)
    91. 'Dim pen1 As Pen = New Pen(Brushes.Black, 0.8)
    92. Dim mybrush As SolidBrush = New SolidBrush(Color.LightGray)
    93. Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
    94. CurrentY = topMargin + 500
    95. e.Graphics.FillRectangle(mybrush, leftMargin + 10, CurrentY, 750, 25)
    96. 'tbkunde.Text = Kundenangebot.Einzelangebot.Rows(0).Item("Firma").ToString
    97. 'Tabellenkopfzeilen, Überschriften stimmen mit dem DataTable.Spalten überein.
    98. CurrentX = leftMargin + 20
    99. Dim xPos As Integer = CurrentX + 5
    100. Dim XBeschreibung As Integer = xPos + 35
    101. Dim xLänge As Integer = XBeschreibung + 320
    102. Dim xStück As Integer = xLänge + 80
    103. Dim xMenge As Integer = xStück + 80
    104. Dim xEP As Integer = xMenge + 80
    105. Dim xGP As Integer = xEP + 70
    106. e.Graphics.DrawString("Pos.", fntText, Brushes.Black, CurrentX, CurrentY + 4)
    107. e.Graphics.DrawString("Beschreibung", fntText, Brushes.Black, XBeschreibung, CurrentY + 4)
    108. e.Graphics.DrawString("Länge", fntText, Brushes.Black, xLänge, CurrentY + 4)
    109. e.Graphics.DrawString("Stück", fntText, Brushes.Black, xStück, CurrentY + 4)
    110. e.Graphics.DrawString("Menge", fntText, Brushes.Black, xMenge, CurrentY + 4)
    111. e.Graphics.DrawString("EP (€)", fntText, Brushes.Black, xEP, CurrentY + 4)
    112. e.Graphics.DrawString("GP (€)", fntText, Brushes.Black, xGP, CurrentY + 4)
    113. ' Tabelleninhalt zeichnen. Die einzelnen Zeilen in der Tabelle werden aus der DataTable geholt, bis der letzte Datensatz erreicht ist.
    114. CurrentY = CurrentY + Angebotstitelschrifthöhe + 20
    115. Dim intstart As Integer = 0
    116. Dim txtheight As Integer
    117. txtheight = PrintDocument1.DefaultPageSettings.PaperSize.Height - PrintDocument1.DefaultPageSettings.Margins.Top - PrintDocument1.DefaultPageSettings.Margins.Bottom
    118. Dim linesperpage As Integer = CInt(Math.Round(txtheight / (fntText.Height + 0.5)))
    119. Dim i As Integer
    120. Dim currentpositionrow = DirectCast(DirectCast(EinzelangebotBindingSource.Current, DataRowView).Row, Kundenangebot.EinzelangebotRow)
    121. For i = 0 To Kundenangebot.Einzelangebot.Rows.Count - 1
    122. netto = currentpositionrow.Netto
    123. mwst = currentpositionrow.MwSt
    124. brutto = currentpositionrow.Brutto
    125. brutto = netto + mwst
    126. Dim j As Integer
    127. j += 10
    128. pos = currentpositionrow.Pos.ToString
    129. element = currentpositionrow.Element
    130. dicke = currentpositionrow.Kerndicke
    131. beschreibung = "Kerndicke" & vbTab & vbTab & currentpositionrow.Kerndicke _
    132. & vbCrLf _
    133. & "Dämmkern" & vbTab & vbTab & currentpositionrow.Dämmkern & vbCrLf _
    134. & "U-Wert" & vbTab & vbTab & vbTab & currentpositionrow._U_Wert & " W/m²K" & vbCrLf _
    135. & "Stahldicke (A/I)" & vbTab & vbTab & currentpositionrow._Stahldicke__A_I_ & vbCrLf _
    136. & "Profilierung (A/I)" & vbTab & vbTab & currentpositionrow._Profilierung__A_I_ & vbCrLf _
    137. & "Beschichtung (A/I)" & vbTab & vbTab & currentpositionrow._Beschichtung__A_I_ & vbCrLf _
    138. & "Farbton (A/I)" & vbTab & vbTab & currentpositionrow._Farbton__A_I_
    139. länge = currentpositionrow.Länge
    140. stück = currentpositionrow.Stück
    141. menge = currentpositionrow.Menge
    142. ep = currentpositionrow._Preis__inkl__Fracht_.ToString
    143. gp = currentpositionrow.Netto.ToString
    144. element = currentpositionrow.Anwendung & " " & currentpositionrow.Element
    145. g.DrawString(CStr(j), fntText, Brushes.Black, xPos, CurrentY) 'Pos
    146. g.DrawString(element, fntText, Brushes.Black, XBeschreibung, CurrentY) 'Element
    147. g.DrawString(beschreibung, fntText, Brushes.Black, XBeschreibung, CurrentY + 20)
    148. g.DrawString(länge, fntText, Brushes.Black, xLänge, CurrentY) 'Länge
    149. g.DrawString(stück, fntText, Brushes.Black, xStück, CurrentY) 'Stück
    150. g.DrawString(menge, fntText, Brushes.Black, xMenge, CurrentY) 'Menge
    151. g.DrawString(ep, fntText, Brushes.Black, xEP, CurrentY) 'EP
    152. g.DrawString(gp, fntText, Brushes.Black, xGP, CurrentY) 'GP
    153. CurrentY = CurrentY + Angebotstitelschrifthöhe + 150
    154. g.DrawLine(pen1, CurrentX, CurrentY - 10, CurrentX + 730, CurrentY - 10)
    155. g.DrawString(String.Format(" - Seite {0} -", page + 1), fntText, Brushes.Black, 380, 1120)
    156. currentrecord += 1
    157. 'If bottomMargin - 100 > CurrentY Then
    158. ' e.HasMorePages = False
    159. 'Else
    160. ' e.HasMorePages = True
    161. 'End If
    162. Next
    163. 'Dieser Teil bezieht sich auf Text, der nach dem einfügen aller Angebotspositionen unter der Tabelle als Kostenübersicht gedruckt werden soll.
    164. CurrentY = CurrentY + 20
    165. Dim xPos1 As Integer = leftMargin + 600
    166. Dim i1 As Integer
    167. Dim netto1 As Double
    168. Dim mwst1 As Double
    169. Dim brutto1 As Double
    170. For i1 = 0 To DataGridView1.Rows.Count - 2
    171. netto1 += CDbl(DataGridView1.Rows(i1).Cells(14).Value)
    172. Next
    173. mwst1 = netto * 0.19
    174. brutto1 = netto + mwst
    175. lblgesamtnetto.Text = Format(netto, "#,##.00")
    176. lblgesamtmwst.Text = Format(mwst, "#,##.00")
    177. lblgesamtbrutto.Text = Format(brutto, "#,##.00")
    178. g.DrawString("Netto [€]", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY)
    179. g.DrawString(lblgesamtnetto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 90, CurrentY)
    180. g.DrawString("MwSt [€]", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 20)
    181. g.DrawString(lblgesamtmwst.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 90, CurrentY + 20)
    182. g.DrawString("Brutto [€]", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 40)
    183. g.DrawString(lblgesamtbrutto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 90, CurrentY + 40)
    184. End Sub


    Ich habe den Abschnitt mit e.hasmorepages auskommentiert, weil der Zähler im PrintPreview-Dialog bis unendlich zählt. Beim prüfen der Druckansicht und der Positionen der Strings ist das halt ein wenig nervig. Wenn nicht auskommentiert funzt es halt nich.
    @silverbob76GE Dann solletst Du mal das Tut, speziell Post #2, durcharbeiten: Drucken mehrseitiger Dokumente
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Also erstmal rate ich das selbe wie @RodFromGermany. Sein Tutorial hat mir selbst bei solch einem Problem geholfen.

    Aber mal als kleine Anmerkung:

    VB.NET-Quellcode

    1. Dim currentrecord As Integer = 0

    sollte in die BeginPrint Prozedur.
    Du hast in deinem Code zwar ein Maximum an Zeilen oder ähnlichem aber berechnest nirgendwo wann dieses Maximum erreicht ist.

    VB.NET-Quellcode

    1. recordsperpage
    taucht genau einmal in deinem Code auf.

    Hier mal ein Versuch aus einem meiner Projekte.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Imports Statistik.HartmannDts
    3. Public Class dlgDruckenMonatsStatistik
    4. Private seitenZaehler As Integer
    5. Private benoetigteSeitenzahl As Integer
    6. Private actLine As Integer
    7. Private zeilenProSeite As Integer = 23
    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 logo As Bitmap = My.Resources.LogoAGH
    15. Private Sub dlgDruckenMonatsStatistik_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. ppc.Document = PrintDocument1
    17. ppc.Zoom = 1
    18. PrintDocument1.DefaultPageSettings.Landscape = True
    19. For Each drucker As String In PrinterSettings.InstalledPrinters
    20. cboDrucker.Items.Add(drucker.ToString)
    21. Next
    22. cboDrucker.Text = PrintDocument1.PrinterSettings.PrinterName
    23. seitenzahlberechnen()
    24. 'bsFiltern()
    25. End Sub
    26. Private Sub bsFiltern()
    27. PlanBindingSource.FilterX("Uploaddatum >= ? AND Uploaddatum <= ? AND berechnen = True", dtpDruckenVon.Value, dtpDruckenBis.Value)
    28. End Sub
    29. Private Sub seitenzahlberechnen()
    30. Dim planCount As Integer = PlanBindingSource.Count - 1
    31. benoetigteSeitenzahl = CInt(Math.Ceiling(planCount / zeilenProSeite))
    32. If benoetigteSeitenzahl = 0 Then
    33. ppc.Rows = 1
    34. Else
    35. ppc.Rows = benoetigteSeitenzahl
    36. End If
    37. End Sub
    38. Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    39. actLine = 0
    40. seitenZaehler = 1
    41. End Sub
    42. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    43. Dim g = e.Graphics
    44. Dim x As Single = e.MarginBounds.Left
    45. Dim y As Single = e.MarginBounds.Top
    46. PrintDocument1.DocumentName = "Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString
    47. g.DrawImage(logo, x + 900, y - 70, 130, 40)
    48. g.DrawString("Hygienepläne ", _fontHead, _Brush, x - 70, y - 70)
    49. g.DrawString("Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString, _font, _Brush, x - 70, y - 40)
    50. g.DrawString("Nr", _fontBold, _Brush, x - 70, y + 10)
    51. g.DrawString("Einstelldatum", _fontBold, _Brush, x - 40, y + 10)
    52. g.DrawString("Einrichtung", _fontBold, _Brush, x + 80, y + 10)
    53. g.DrawString("Bemerkung", _fontBold, _Brush, x + 390, y + 10)
    54. g.DrawString("Uploaddatum", _fontBold, _Brush, x + 810, y + 10)
    55. g.DrawString("VertriebMA", _fontBold, _Brush, x + 920, y + 10)
    56. g.DrawLine(Pens.Black, x - 70, y + 30, x + 1030, y + 30)
    57. Dim printedLines = 0
    58. For i = actLine To actLine + zeilenProSeite - 1
    59. If i >= PlanBindingSource.Count Then ' bei -1 fehlt die letzte zu druckende Zeile
    60. Exit For
    61. End If
    62. printedLines += 1
    63. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    64. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    65. If rwPlan.berechnen = True Then
    66. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    67. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    68. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    69. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    70. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    71. If Not rwVertriebler Is Nothing Then
    72. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    73. Else
    74. g.DrawString("keiner", _font, _Brush, x + 920, y + 40)
    75. End If
    76. y += LineHeight + 10
    77. Else
    78. ' ##########################################
    79. ' diese hier sind nicht berechnet
    80. g.DrawString("nicht berechnet", _font, _Brush, x - 70, y + 40)
    81. y += LineHeight + 10
    82. ' ##########################################
    83. End If
    84. Next
    85. actLine += printedLines
    86. g.DrawString("gedruckt am " & Date.Today.ToShortDateString & " um: " & DateTime.Now.ToShortTimeString, _fontSmall, _Brush, New Point(980, 800))
    87. g.DrawString(String.Format("Seite {0} von {1}", seitenZaehler, benoetigteSeitenzahl), _fontSmall, _Brush, New Point(20, 800))
    88. If seitenZaehler <= benoetigteSeitenzahl Then
    89. e.HasMorePages = True
    90. seitenZaehler += 1
    91. ElseIf actLine >= PlanBindingSource.Count - 1 Then
    92. e.HasMorePages = False
    93. End If
    94. End Sub
    95. Private Sub btnDrucken_Click(sender As Object, e As EventArgs) Handles btnDrucken.Click
    96. PrintDocument1.Print()
    97. End Sub
    98. Private Sub dtpDrucken_CloseUp(sender As Object, e As EventArgs) Handles dtpDruckenVon.CloseUp, dtpDruckenBis.CloseUp, dtpDruckenVon.ValueChanged, dtpDruckenBis.ValueChanged
    99. PlanBindingSource.FilterX("Uploaddatum >= ? AND Uploaddatum <= ? AND berechnen = True", dtpDruckenVon.Value, dtpDruckenBis.Value)
    100. ppc.InvalidatePreview()
    101. seitenzahlberechnen()
    102. End Sub
    103. Private Sub pnlDrucken_Paint(sender As Object, e As PaintEventArgs) Handles pnlDrucken.Paint
    104. e.Graphics.DrawLine(Pens.Black, pnlDrucken.Width - 1, 0, pnlDrucken.Width - 1, pnlDrucken.Height)
    105. End Sub
    106. Private Sub nudExemplare_ValueChanged(sender As Object, e As EventArgs) Handles nudExemplare.ValueChanged
    107. PrintDocument1.PrinterSettings.Copies = CShort(nudExemplare.Value)
    108. End Sub
    109. Private Sub cb_Drucken_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboDrucker.SelectedIndexChanged
    110. PrintDocument1.PrinterSettings.PrinterName = cboDrucker.SelectedItem.ToString
    111. ppc.Invalidate()
    112. End Sub
    113. Private Sub dlgDruckenMonatsStatistik_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    114. PlanBindingSource.FilterX("")
    115. End Sub
    116. End Class


    Vielleicht hilft der Code dir ja etwas zu dem Tutorial.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @Akanel

    Danke für den Code. Bin dran, aber habe Probleme mit dem Briefkopf. Dieser wird nun auch auf Seite 2 gedruckt. Versuche gerade herauszufinden warum.

    Hab mir auch das TUT "Drucken mehrseitiger Dokumente" von @RodFromGermany nochmal angesehen. Aber komme damit nicht so recht klar. Hab keine Richtextbox als Quelle meiner Strings.
    Überlege gerade nun, wie ich die Zeilen in der For-Schelife zähle und dann mit der GEsamtzeilenanzahl auf der Siete vergleiche, um dann e.hasmorepages = true zu setzen.