Druck über mehrere Seiten.....Nur die erste wird gedruckt

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hallo, wie gesagt poste ich nun mein kleines Druckevent. :)

    Aufs Begin_Print habe ich verzichtet. Ist in meinem Fall jetzt nicht so relevant finde ich.
    Dieses kleine Druckevent druckt eine oder mehrere Seiten aus
    ( Abhängig von der Anzahl der Daten in der DB, die übrigens eine lokale MS-Access Datenbank ist, und die unter anderem eine Tabelle mit Kontakten besitzt)


    VB.NET-Quellcode

    1. Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
    2. Dim sql As String = "select * from kontakte order by nachname "
    3. Dim cmd As New OleDb.OleDbCommand
    4. Dim dt As New DataTable
    5. Dim da As New OleDb.OleDbDataAdapter
    6. Dim g = e.Graphics
    7. Dim ft = New Font("Times New Roman", 10, FontStyle.Regular)
    8. ' Text Ausrichtung
    9. text_rechts.Alignment = StringAlignment.Far 'far= rechts ausgerichtet
    10. text_links.Alignment = StringAlignment.Near 'near ist links ausgerichtet
    11. text_mitte.Alignment = StringAlignment.Center ' center ist mittig ausgerichtet
    12. cn.Open()
    13. cmd.Connection = cn
    14. cmd.CommandText = sql
    15. da.SelectCommand = cmd
    16. x_achse = 100
    17. y_achse = 500
    18. g.DrawString("Kontaktliste", New Font("Times New Roman", 26, FontStyle.Bold), Brushes.Black, y_achse, x_achse, text_links)
    19. 'erste zahl startpunkt von links ( Y achse ),zweite zahl ist die höhe von oben ( x achse ),dritte zahl ist der endpunkt ( y achse),vierte zahl ist die höhe von oben ( x achse )
    20. g.DrawLine(Pens.Black, 500, 150, 700, 150)
    21. x_achse = 200
    22. y_achse = 40
    23. da.Fill(dt)
    24. For i As Integer = firstRow To dt.Rows.Count - 1
    25. If i - firstRow < 16 Then
    26. g.DrawString(dt.Rows(i)("vorname"), ft, Brushes.Black, y_achse, x_achse, text_links)
    27. g.DrawString(dt.Rows(i)("nachname"), ft, Brushes.Black, y_achse + 100, x_achse, text_links)
    28. g.DrawString(dt.Rows(i)("strasse"), ft, Brushes.Black, y_achse + 230, x_achse, text_links)
    29. g.DrawString(dt.Rows(i)("plz"), ft, Brushes.Black, y_achse + 410, x_achse, text_links)
    30. g.DrawString(dt.Rows(i)("wohnort"), ft, Brushes.Black, y_achse + 500, x_achse, text_links)
    31. g.DrawString(dt.Rows(i)("telefon"), ft, Brushes.Black, y_achse + 650, x_achse, text_links)
    32. g.DrawString(dt.Rows(i)("mobil"), ft, Brushes.Black, y_achse + 750, x_achse, text_links)
    33. g.DrawString(dt.Rows(i)("email"), ft, Brushes.Black, y_achse + 850, x_achse, text_links)
    34. g.DrawString(dt.Rows(i)("geburtstag"), ft, Brushes.Black, y_achse + 1000, x_achse, text_links)
    35. x_achse = x_achse + 30 'abstand von der vorherigen zeile
    36. Else
    37. firstRow = i
    38. e.HasMorePages = True
    39. cn.Close()
    40. g.DrawString("Ausdruck vom :" & " " & aktuellesDatum, ft, Brushes.Black, 60, 750, text_links)
    41. Exit Sub
    42. End If
    43. Next
    44. g.DrawString("Ausdruck vom :" & " " & aktuellesDatum, ft, Brushes.Black, 60, 750, text_links)
    45. End Sub
    46. Private Sub PrintDocument1_EndPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.EndPrint
    47. cn.Close()
    48. Me.Close()
    49. End Sub
    geeeht auch - nur unwirtschaftlich, (und auch nicht so, wie das Drucken-Konzept eiglich designed ist im Framework).
    Für Jede Seite werden die gesamten Daten in eine neue DataTable geladen - von der dann ein bestimmter Ausschnitt gedruckt wird.
    Warum nicht lieber die Daten einmal laden, und pro Seite den geeigneten Ausschitt drucken (ohne jedesmal neu laden)?
    Etwa .BeginPrint zu verwenden ist keine Option?