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.

    Drucken von mehreren Seiten

    Hallo zusammen,

    ich habe ein Problem mit dem Drucken mehrerer Seiten. Ich habe mir auch schon das Tutorial von @RodFromGermany Drucken mehrseitiger Dokumente durchgelesen, aber schaffe es nicht das auf mein Projekt umzusetzen.

    So sieht meine PrintPage bisher aus.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim g = e.Graphics
    2. Dim _font = New Font("Segoe UI", 10)
    3. Dim _fontBold = New Font("Segoe UI", 10, FontStyle.Bold)
    4. Dim _fontHead = New Font("Segoe UI", 12)
    5. Dim _fontSmall = New Font("Segoe UI", 8)
    6. Dim _Brush = Brushes.Black
    7. Dim x As Single = e.MarginBounds.Left
    8. Dim y As Single = e.MarginBounds.Top
    9. Dim LineHeight As Single = _font.GetHeight(e.Graphics)
    10. Dim logo As Bitmap = My.Resources.LogoAGH
    11. PrintDocument1.DocumentName = "Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString
    12. g.DrawImage(logo, x + 900, y - 70, 130, 40)
    13. g.DrawString("Hygienepläne", _fontHead, _Brush, x - 70, y - 70)
    14. g.DrawString("Monatsstatistik Pläne vom " & dtpDruckenVon.Value.ToShortDateString & " bis " & dtpDruckenBis.Value.ToShortDateString, _font, _Brush, x - 70, y - 40)
    15. g.DrawString("Nr", _fontBold, _Brush, x - 70, y + 10)
    16. g.DrawString("Einstelldatum", _fontBold, _Brush, x - 40, y + 10)
    17. g.DrawString("Einrichtung", _fontBold, _Brush, x + 80, y + 10)
    18. g.DrawString("Bemerkung", _fontBold, _Brush, x + 390, y + 10)
    19. g.DrawString("Uploaddatum", _fontBold, _Brush, x + 810, y + 10)
    20. g.DrawString("VertriebMA", _fontBold, _Brush, x + 920, y + 10)
    21. g.DrawLine(Pens.Black, x - 70, y + 30, x + 1030, y + 30)
    22. For i = 0 To PlanBindingSource.Count - 1
    23. Dim rwPlan = PlanBindingSource.At(Of PlanRow)(i)
    24. Dim rwVertriebler = rwPlan.VertriebmitarbeiterRow
    25. If rwPlan.berechnen = True Then
    26. g.DrawString(rwPlan.Nr.ToString, _font, _Brush, x - 70, y + 40)
    27. g.DrawString(rwPlan.Einstelldatum.ToShortDateString, _font, _Brush, x - 30, y + 40)
    28. g.DrawString(rwPlan.Einrichtungsname.ToString, _font, _Brush, x + 80, y + 40)
    29. g.DrawString(rwPlan.Bemerkung.ToString, _font, _Brush, x + 390, y + 40)
    30. g.DrawString(rwPlan.Uploaddatum.ToShortDateString, _font, _Brush, x + 820, y + 40)
    31. g.DrawString(rwVertriebler.Name.ToString, _font, _Brush, x + 920, y + 40)
    32. y += LineHeight + 10
    33. End If
    34. Next
    35. g.DrawString("gedruckt am " & Date.Today.ToShortDateString & " um: " & DateTime.Now.ToShortTimeString, _fontSmall, _Brush, New Point(980, 800))


    Nun habe ich keinen Ansatz wie ich es hinbekomme das diese Tabelle , wenn nötig, auf 2 Seiten gedruckt werden kann.
    Vielleicht kann mir hier jemand Tipps geben wie ich es gescheit anstelle.

    Der ein oder andere wird sich vielleicht an den Kopf fassen und denken "WTF ist das für ein Müll". Wenn dem so ist, dass mein Code ranz ist, dann bin ich immer offen für Verbesserungsvorschläge.

    Danke.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    schau dir mal forlgenden code an, damit sende ich x beliebig viele PDF´s an einen Drucker mit x Seiten

    Spoiler anzeigen

    VB.NET-Quellcode

    1. '*** Option Strict ON, verhindert eine unsaubere Programmierung ***
    2. Option Strict On
    3. Imports System.Drawing.Printing
    4. Imports System.IO
    5. Imports System.Net.Sockets
    6. Imports System.Windows
    7. Imports System.Threading
    8. ''' <summary>
    9. ''' *** Ein Programm, mithilfe man per DragAnd Drop oder OpenfileDialog bis zu 65.000 PDF´s an einen Drucker Senden kann ***
    10. ''' </summary>
    11. Public Class Form1
    12. '*** Globale Dimensionierung einer MessageBoxResult ***
    13. Dim retval As DialogResult
    14. '*** 3 Threads Deklarieren ***
    15. Private DruckerHPFThread As Thread
    16. Private DruckerNY77Thread As Thread
    17. Private DruckerRFPThread As Thread
    18. Private ProgressBarThread As Thread
    19. ''' <summary>
    20. ''' *** Drucken ***
    21. ''' </summary>
    22. ''' <param name="sender"></param>
    23. ''' <param name="e"></param>
    24. Private Sub CmdDrucken_Click(sender As Object, e As EventArgs) Handles cmdDrucken.Click
    25. '*** MEssagebox mit einer returnValue ***
    26. retval = MessageBox.Show("Möchten Sie wirklich Drucken?", "Hinweis", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    27. '*** Wennn in der Messsagebox Ja geklickt wurde dann.... ***
    28. If retval = vbYes And cboDrucker.SelectedIndex > 0 And ListBox1.Items.Count > 0 Then
    29. '*** Wenn Index 0 gewählt dann Ignorieren, wennn index größer 0 Dann Drucken ***
    30. If cboDrucker.SelectedIndex = 0 Then
    31. '*** RFP ***
    32. ElseIf cboDrucker.SelectedIndex = 1 Then
    33. '*** RFP Backoffice ***
    34. '*** Dem Thread seine Sub zuweisen ***
    35. Dim DruckerRFPThread As New Threading.Thread(AddressOf DruckerRFP)
    36. Dim ProgressBarThread As New Threading.Thread(AddressOf ProgressBar)
    37. DruckerRFPThread.IsBackground = True
    38. DruckerRFPThread.Priority = Threading.ThreadPriority.Normal
    39. DruckerRFPThread.Start()
    40. ProgressBarThread.IsBackground = True
    41. ProgressBarThread.Priority = Threading.ThreadPriority.Normal
    42. ProgressBarThread.Start()
    43. System.Threading.Thread.Sleep(200)
    44. '*** NY77 ***
    45. ElseIf cboDrucker.SelectedIndex = 2 Then
    46. '*** NY77 Backoffice ***
    47. '*** Dem Thread seine Sub zuweisen ***
    48. Dim DruckerNY77Thread As New Threading.Thread(AddressOf DruckerNY77)
    49. Dim ProgressBarThread As New Threading.Thread(AddressOf ProgressBar)
    50. DruckerNY77Thread.IsBackground = True
    51. DruckerNY77Thread.Priority = Threading.ThreadPriority.Normal
    52. DruckerNY77Thread.Start()
    53. ProgressBarThread.IsBackground = True
    54. ProgressBarThread.Priority = Threading.ThreadPriority.Normal
    55. ProgressBarThread.Start()
    56. System.Threading.Thread.Sleep(200)
    57. '*** HPF ***
    58. ElseIf cboDrucker.SelectedIndex = 3 Then
    59. '*** Dem Thread seine Sub zuweisen ***
    60. Dim DruckerHPFThread As New Threading.Thread(AddressOf DruckerHPF)
    61. Dim ProgressBarThread As New Threading.Thread(AddressOf ProgressBar)
    62. DruckerHPFThread.IsBackground = True
    63. DruckerHPFThread.Priority = Threading.ThreadPriority.Normal
    64. DruckerHPFThread.Start()
    65. ProgressBarThread.IsBackground = True
    66. ProgressBarThread.Priority = Threading.ThreadPriority.Normal
    67. ProgressBarThread.Start()
    68. System.Threading.Thread.Sleep(200)
    69. End If
    70. '** Textfeld nach abschiocken an den Drucker wieder leeren ***
    71. Else
    72. MessageBox.Show("Bitte Wählen Sie einen Drucker aus und fügen Sie eine PDF hinzu.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
    73. End If
    74. End Sub
    75. '*** HPF Backoffice ***
    76. Private Sub DruckerHPF()
    77. If Me.InvokeRequired Then
    78. Me.Invoke(Sub() Me.DruckerHPF())
    79. Return
    80. End If
    81. '** Deklaration eines Druckers im Lokalem netzwerk ***
    82. Using s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    83. s.Connect("IP VOM DRUCKER", 9100)
    84. For Each zeile As String In Me.ListBox1.Items
    85. '*** Senden e ines Srings an den Drucker ****
    86. s.SendFile(zeile)
    87. Next
    88. Me.ListBox1.Items.Clear()
    89. End Using
    90. End Sub
    91. '*** RFP Backoffice Thread ***
    92. Private Sub DruckerRFP()
    93. If Me.InvokeRequired Then
    94. Me.Invoke(Sub() Me.DruckerRFP())
    95. Return
    96. End If
    97. '** Deklaration eines Druckers im Lokalem netzwerk ***
    98. Using s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    99. s.Connect("IP VOM DRUCKER", 9100)
    100. For Each zeile As String In Me.ListBox1.Items
    101. '*** Senden e ines Srings an den Drucker ****
    102. s.SendFile(zeile)
    103. Next
    104. Me.ListBox1.Items.Clear()
    105. End Using
    106. End Sub
    107. '*** NY77 Backoffice Thread ***
    108. Private Sub DruckerNY77()
    109. If Me.InvokeRequired Then
    110. Me.Invoke(Sub() Me.DruckerNY77())
    111. Return
    112. End If
    113. '** Deklaration eines Druckers im Lokalem netzwerk ***
    114. Using s As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    115. s.Connect("IP VOM DRUCKER", 9100)
    116. For Each zeile As String In Me.ListBox1.Items
    117. '*** Senden e ines Srings an den Drucker ****
    118. s.SendFile(zeile)
    119. Next
    120. Me.ListBox1.Items.Clear()
    121. End Using
    122. End Sub
    123. '*** Thread für die Progressbar die den Timer startet ***
    124. Private Sub ProgressBar()
    125. If Me.InvokeRequired Then
    126. Me.Invoke(Sub() Me.ProgressBar())
    127. Return
    128. End If
    129. Timer1.Start()
    130. End Sub
    131. '*** Fertige Methoden ***
    132. ''' <summary>
    133. ''' '*** Load ereignis ListBox Füllen, Timer Starten ***
    134. ''' </summary>
    135. ''' <param name="sender"></param>
    136. ''' <param name="e"></param>
    137. Private Sub PDFPrint_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    138. ''*** cboBox Befüllen ***
    139. cboDrucker.SelectedIndex = 0
    140. cboDrucker.DrawMode = DrawMode.OwnerDrawFixed
    141. '*** Timer2 Starten ***
    142. Timer2.Start()
    143. End Sub
    144. ''' <summary>
    145. ''' *** Dateien Hinzufügen ***
    146. ''' </summary>
    147. ''' <param name="sender"></param>
    148. ''' <param name="e"></param>
    149. Private Sub CmdAddFiles_Click(sender As Object, e As EventArgs) Handles cmdAddFiles.Click
    150. '*** Multiselect Aktivieren ***
    151. '*** Filter der Dialogbox ***
    152. '*** Wir möchten bitte nur PDF´s sehen ***
    153. Dim OpenFileDialog1 As New OpenFileDialog With {
    154. .Multiselect = True,
    155. .InitialDirectory = (Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop)),
    156. .FileName = "",
    157. .Filter = "PDF (*.pdf)|*.pdf|PDF (*.PDF)|*.PDF",
    158. .FilterIndex = 2,
    159. .RestoreDirectory = True
    160. }
    161. '*** FileDialog anzeigen ***
    162. ' OpenFileDialog1.ShowDialog()
    163. Dim result = OpenFileDialog1.ShowDialog()
    164. If result = DialogResult.OK Then
    165. '*** Für jede Datei einen Pfad in die Richtextbox schreiben ***
    166. For Each b As String In OpenFileDialog1.FileNames
    167. '*** Gibt jeweils eine Zeile in der txtxBox aus ***
    168. ListBox1.Items.Add(b)
    169. Next
    170. Else
    171. End If
    172. End Sub
    173. ''' <summary>
    174. ''' *** Drag and Drop Aktivieren ***
    175. ''' </summary>
    176. ''' <param name="sender"></param>
    177. ''' <param name="e"></param>
    178. Private Sub ListBox1_DragDrop(sender As Object, e As DragEventArgs) Handles ListBox1.DragDrop
    179. '*** Nur PDF´S erlauben bei Drag and Drop***
    180. Dim s() As String = CType(e.Data.GetData("FileDrop", False), String())
    181. For i = 0 To s.Length - 1
    182. If s(i).ToLower().EndsWith(".pdf") Then
    183. ListBox1.Items.Add(s(i))
    184. End If
    185. Next i
    186. End Sub
    187. ''' <summary>
    188. ''' *** Drag and Drop enable und Effekt ***
    189. ''' </summary>
    190. ''' <param name="sender"></param>
    191. ''' <param name="e"></param>
    192. Private Sub ListBox1_DragEnter(sender As Object, e As DragEventArgs) Handles ListBox1.DragEnter
    193. If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
    194. e.Effect = DragDropEffects.All
    195. Else
    196. e.Effect = DragDropEffects.None
    197. End If
    198. End Sub
    199. ''' <summary>
    200. ''' *** Timer für die PrGBar ***
    201. ''' </summary>
    202. ''' <param name="sender"></param>
    203. ''' <param name="e"></param>
    204. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    205. '*** Progressbar Value erhöhen um jeweils 1 ***
    206. prgBar.Increment(1)
    207. '*** Wenn Value der ProgressBar 100 erreicht, dann Meldung ausgeben und dateien schicken ***
    208. If prgBar.Value = 100 Then
    209. '*** Timer stoppen ***
    210. Timer1.Stop()
    211. '*** Hinweis das alle dateien an den Drucker gesendet wurden ****
    212. MessageBox.Show("Die Dateien wurden gedruckt.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information)
    213. '*** Value zurücksetzen ***
    214. prgBar.Value = 0
    215. End If
    216. '*** Prozentangabe im label ***
    217. lblStatus.Text = prgBar.Value & (" %")
    218. End Sub
    219. ''' <summary>
    220. ''' *** Bei DoppelKlick Markierten eintrag Öffnen ***
    221. ''' </summary>
    222. ''' <param name="sender"></param>
    223. ''' <param name="e"></param>
    224. Private Sub ListBox1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDoubleClick
    225. If ListBox1.SelectedItem Is Nothing = False Then
    226. '*** Ausgewählten index Starten in AdobeReader ***
    227. Process.Start(ListBox1.SelectedItem.ToString())
    228. End If
    229. End Sub
    230. ''' <summary>
    231. ''' *** Der Zähler für die Anzahl der ListBox einträge ***
    232. ''' </summary>
    233. ''' <param name="sender"></param>
    234. ''' <param name="e"></param>
    235. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    236. '*** Items in der listbox zählen und Ausgeben ***
    237. Dim zähler As Integer = 0
    238. zähler = ListBox1.Items.Count
    239. If zähler = 0 Then
    240. cmdDrucken.Text = zähler.ToString() + " Dateien Drucken"
    241. ElseIf zähler = 1 Then
    242. cmdDrucken.Text = zähler.ToString() + " Datei Drucken"
    243. Else
    244. cmdDrucken.Text = zähler.ToString() + " Dateien Drucken"
    245. End If
    246. If zähler = 0 Then
    247. cmdDrucken.Enabled = False
    248. cmdLeeren.Enabled = False
    249. Else
    250. cmdDrucken.Enabled = True
    251. cmdLeeren.Enabled = True
    252. End If
    253. End Sub
    254. ''' <summary>
    255. ''' *** Form Closing and Close - Müll einsammeln ***
    256. ''' </summary>
    257. ''' <param name="sender"></param>
    258. ''' <param name="e"></param>
    259. Private Sub PDFPrint_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    260. '*** Wir sammeln den Müll ein ***
    261. GC.Collect()
    262. End Sub
    263. ''' <summary>
    264. ''' *** Müll wegbringen ***
    265. ''' </summary>
    266. ''' <param name="sender"></param>
    267. ''' <param name="e"></param>
    268. Private Sub PDFPrint_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    269. '*** Wir sammeln den Müll ein ***
    270. GC.Collect()
    271. End Sub
    272. ''' <summary>
    273. ''' *** Müll wegbringen ***
    274. ''' </summary>
    275. ''' <param name="sender"></param>
    276. ''' <param name="e"></param>
    277. Private Sub CmdLeeren_Click(sender As Object, e As EventArgs) Handles cmdLeeren.Click
    278. '*** Textfeld leeren ***
    279. ListBox1.Items.Clear()
    280. '*** Wir bringen den Müll raus ***
    281. GC.Collect()
    282. End Sub
    283. ''' <summary>
    284. ''' *** Farblicher Effekt bei dem Drucker ***
    285. ''' </summary>
    286. ''' <param name="sender"></param>
    287. ''' <param name="e"></param>
    288. Private Sub CboDrucker_DrawItem(sender As Object, e As DrawItemEventArgs) Handles cboDrucker.DrawItem
    289. '*** VAriablendeklaration ***
    290. Dim sItem As String = CType(cboDrucker.Items(e.Index), String)
    291. Dim b As New SolidBrush(Color.Black)
    292. Select Case e.Index
    293. Case 0
    294. b = New SolidBrush(Color.Red)
    295. Case 1
    296. b = New SolidBrush(Color.Black)
    297. Case 2
    298. b = New SolidBrush(Color.Black)
    299. Case 3
    300. b = New SolidBrush(Color.Black)
    301. End Select
    302. '*** Text ausgeben ***
    303. e.DrawBackground()
    304. e.Graphics.DrawString(sItem, e.Font, b, e.Bounds.X, e.Bounds.Y)
    305. e.DrawFocusRectangle()
    306. End Sub
    307. ''' <summary>
    308. ''' *** Bei Key Down Backspacce Taste Freischalten, wenn diese Gedrückt, dann mMarkierten eintrag löschen ***
    309. ''' </summary>
    310. ''' <param name="sender"></param>
    311. ''' <param name="e"></param>
    312. Private Sub ListBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBox1.KeyDown
    313. If e.KeyCode = Keys.Back Then
    314. '*** Markiertes Item Löschen ***
    315. ListBox1.Items.Remove(ListBox1.SelectedItem)
    316. End If
    317. End Sub
    318. End Class
    Bilder
    • Unbenannt.JPG

      33,61 kB, 529×430, 223 mal angesehen
    @BlackNova

    > 300 Zeilen für sein Problem wird ihn wohl überfordern und warscheinlich auch nicht Helfen.

    @Akanel
    Wenn ich das richtig sehe, arbeitest du mit einer Tabelle, welche du ja nicht so einfach "teilen" kannst.
    Ich mache fast nie was mit drucken, deshalb habe ich es mir jetzt nicht genau angesehen.

    So als Idee: Du musst wohl berechnen wieviele Zeilen deiner Tabelle du auf eine Seite bekommst.
    Wenn du die maximale Anzahl an Zeilen für eine Seite erreicht hast musst du die Tabelle abschliessen, und eine neue AUF DER NEUEN SEITE anfangen.

    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. ##

    @BlackNova Danke Dir für Deine Antwort.
    Ich habe mir den Code mal angesehen aber so wie ich ihn verstehe ziehst du fertige PDF´s per Drag and Drop auf die Listbox und Druckst diese dann auch alle nacheinander.
    Mein Problem besteht aber darin das ich meine PrintPageRoutine selbst erstelle und keine vorgefertigten Dokumente habe.
    Trotzdem Danke für deine Antwort.

    @Nofear23m
    Richtig ich erstelle mir die Tabellenköpfe manuell, und beziehe meine Daten dann aus einem Typisierten Dataset.
    So wie Du es beschreibst habe ich mit das schon gedacht und auch so aus Rod´s Tutorial verstanden.
    Aber wie muss ich da ansetzen?
    Ich habe ja die Tabellenköpfe und weiter oben noch das Logo. Das Muss dann ja auch irgendwie berücksichtigt werden. Auf der 2.ten Seite sollen die Tabellenköpfe und Logo etc. nicht mehr drauf.

    Ich Lese mir das Tutorial nochmal durch, irgendwas wichtiges muss ich wohl überlesen haben.
    Hallo

    Habe gerade mal schnell das Tut durchgescrollt. Alles drinnen was man braucht.

    Du kannst ja abfragen wie groß die Seite ist (mit berücksichtigung der eingestellten Seitenränder), richtig?
    Du weist auch wie groß das Logo ist das auf der Seite Platziert wird, korrekt? (Immerhin platzierst du es ja)
    Die Tabelle und diese Dinge platzierst auch du und kennst Schriftgrößer (MeasureString) und Zeilenhöhe der Tabellenzeilen, richtig?

    Also addieren wird diese ganzen Elemente und schon wissen wir WO wir die Tabelle teilen müssen.

    Tipp: Drucke eine Seite aus und zeichne dir die Veriablen drauf, und dann gehe im code alles durch.

    @BlackNova Ja, die frage ist nur obs ihm auch geholfen hat einfach C&P aus deinen Programm. Aber du hast es ja gut gemeint. :)

    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. ##

    @Akanel Wie sollen denn die Seiten aussehen?

    Quellcode

    1. Kopf
    2. n Zeilen Tabelle
    3. ---
    4. Kopf
    5. n Zeilen Tabelle
    6. ---
    7. Kopf
    8. n Zeilen Tabelle
    oder

    Quellcode

    1. Kopf1
    2. n Zeilen Tabelle
    3. ---
    4. Kopf2
    5. n Zeilen Tabelle
    6. ---
    7. Kopf3
    8. n Zeilen Tabelle
    (damit ist nicht die Seitennummer gemeint)
    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!
    Die 2. Variante trifft es eher.
    Anbei mal ein Screenshot wie es derzeit aussieht. Da sieht man es wohl auch besser.
    Bilder
    • Ausdruck.PNG

      44,04 kB, 1.130×799, 218 mal angesehen
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Anbei mal ein Screenshot wie es derzeit aussieht.
    Wo ist da ein Problem?
    Ich kann keins erkennen.
    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!

    Akanel schrieb:

    Das diese Liste auch mal länger sein
    Davon bin ich ausgegangen, wie Du in meinem Post #7 siehst.
    Zähle die Zeilen und wisse dann, wann die Seite voll ist.
    Merk Dir die Nummer der letzten Zeile und mach dann mit der nächsten Seite und der nächsten Zeile weiter.
    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!
    @Akanel Mach mal ein kleines Testprojekt mit einer Tabelle, die im Programm selbst berechnet wird (keine Datenbank).
    Füge da Deinen Druck-Code ein und häng es an Deinen nächsten Post.
    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 mein Versuch.
    Dateien
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @Akanel Sorr, aber das ist absolut ungenügend, da werde ich keinen Handschlag dran tun. ;(
    Einfach irgendwas zusammengepostet, was nicht im geringsten was mit Deinem Problem zu tun hat.
    Ändere das Projekt entsprechend.
    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!

    Akanel schrieb:

    Nun habe ich keinen Ansatz


    Das wird wohl erklären das es ungenügend ist. Weil ich einfach nicht weiß wie ich genau ansetzen soll.

    Aber schön das Du es als "zusammengepostet" verstehst, wenn ein Anfänger nicht weiß wo und wie er ansetzen soll.

    Trotzdem danke ich Dir das du Dir die Zeit genommen hast hier zu lesen.

    Akanel schrieb:

    wenn ein Anfänger nicht weiß wo und wie er ansetzen soll.
    Arbeite zunächst mein Tut vollständig durch: 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Akanel Wenn Dein Code immer noch so aussieht wie in Deinem angehängten Projekt, dann wäre dies die primäre Fehlerzeile:

    VB.NET-Quellcode

    1. For i = 0 To 200
    Du interessierst Dich nicht für das bedruckte Papier, sondern nur um den zu druckenden Text.
    Wenn Du Dich um den Ausdruck kümmerst und nach jeder einzelnen Zeile überprüfst, ob die nächste Zeile noch auf diese Seite passt, weißt Du, wass genau Du eine neue Seite starten musst.
    Wisse, dass pro Seite ein .PrintPage-Aufruf kommt.
    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!
    Also ist die For-Schleife nicht für mein Vorhaben geeignet?
    Damit hole ich ja die Daten aus der Bindingsource, wie man im Startpost sehen kann.
    Man kann dies natürlich auch in eine List(Of String) packen und dann mit For Each durchlaufen. Wäre das geeigneter, oder habe ich Deinen Post nicht richtig verstanden?