Drucken über mehrere Seiten

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von th3Khem.

    Drucken über mehrere Seiten

    Hallo unzwar habe ich das problem, das eine ein DataGridView auslesen lasse.Wenn dieser gedruckt werden soll würde es mehrere seiten beinhalten.Wie stellt man es an, das man wenn der untere zeilenrand erreicht ist, das er auf der nächsten seite weiterdrucken wird?

    VB.NET-Quellcode

    1. For i = 0 To MimotProgram_DataGridView.RowCount - 1
    2. Dim columns_bpos As String ' String deklarieren
    3. Dim columns_identnummer As String ' String deklarieren
    4. Dim columns_bezeichnung As String ' String deklarieren
    5. Dim columns_status As String ' String deklarieren
    6. columns_bpos = MimotProgram_DataGridView.Rows(i).Cells(0).Value
    7. columns_identnummer = MimotProgram_DataGridView.Rows(i).Cells(1).Value
    8. columns_bezeichnung = MimotProgram_DataGridView.Rows(i).Cells(2).Value
    9. columns_status = MimotProgram_DataGridView.Rows(i).Cells(3).Tag
    10. If (columns_bezeichnung.Length() > 12) Then
    11. columns_bezeichnung = columns_bezeichnung.Substring(0, 12)
    12. columns_bezeichnung = columns_bezeichnung & "..."
    13. End If
    14. m = m + 20
    15. If m >= 1060 Then
    16. End If
    17. e.Graphics.DrawString(columns_bpos, New Font("Arial", 11, FontStyle.Regular), Brushes.Black, 63, m)
    18. e.Graphics.DrawString(columns_identnummer, New Font("Arial", 11, FontStyle.Regular), Brushes.Black, 135, m)
    19. e.Graphics.DrawString(columns_bezeichnung, New Font("Arial", 11, FontStyle.Regular), Brushes.Black, 225, m)
    20. If columns_status = "green" Then
    21. e.Graphics.DrawImage(My.Resources.green, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    22. Else
    23. e.Graphics.DrawImage(My.Resources.red, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    24. End If
    25. Next

    Memo schrieb:

    In vielen Programmiersprachen benutzt man dazu das Seitenvorschubszeichen

    .NET kann das besser, da werden alle Seiten einzeln mit GDI "gemalt".
    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!

    th3Khem schrieb:

    k habe versucht es zu verstehen

    Was?
    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!

    th3Khem schrieb:

    das auf meinen code anzuwenden ist mein problem

    Dann solltest Du ggf. Deinen Code vom Kopf auf die Füße (um-)stellen.
    Mach Dir ein kleines Testprogramm mit dem neuen Code und druck einfach auf ein paar Seiten nur die Seitenzahlen, damit Du ein Gefühl dafür bekommst.
    Wenns klappt, stellst Du Deinen Code um. :thumbsup:
    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!
    k hab bisschen geschaut und mein code sieht jetzt so aus er erkennt jetzt wieviel seiten er brauch und so und zählt diese in einer Messagbox hoch aber nicht im druckbaren dockument.Ne idee wieso ?

    VB.NET-Quellcode

    1. Dim m As Integer = 230
    2. For i = 0 To MimotProgram_DataGridView.RowCount - 1
    3. Dim columns_bpos As String ' String deklarieren
    4. Dim columns_identnummer As String ' String deklarieren
    5. Dim columns_bezeichnung As String ' String deklarieren
    6. Dim columns_status As String ' String deklarieren
    7. columns_bpos = MimotProgram_DataGridView.Rows(i).Cells(0).Value
    8. columns_identnummer = MimotProgram_DataGridView.Rows(i).Cells(1).Value
    9. columns_bezeichnung = MimotProgram_DataGridView.Rows(i).Cells(2).Value
    10. columns_status = MimotProgram_DataGridView.Rows(i).Cells(3).Tag
    11. If (columns_bezeichnung.Length() > 15) Then
    12. columns_bezeichnung = columns_bezeichnung.Substring(0, 15)
    13. columns_bezeichnung = columns_bezeichnung & "..."
    14. End If
    15. intCurrentChar = Math.Round(intLineDgvM / intLineCount)
    16. m = m + (font.Height + lineoffset)
    17. e.Graphics.DrawString(columns_bpos, font, Brushes.Black, 63, m)
    18. e.Graphics.DrawString(columns_identnummer, font, Brushes.Black, 135, m)
    19. e.Graphics.DrawString(columns_bezeichnung, font, Brushes.Black, 225, m)
    20. If columns_status = "green" Then
    21. e.Graphics.DrawImage(My.Resources.green, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    22. Else
    23. e.Graphics.DrawImage(My.Resources.red, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    24. End If
    25. If m >= intPrintAreaBottom Then
    26. e.HasMorePages = True
    27. intCurrentChar1 += 1
    28. MsgBox(intCurrentChar & " " & intCurrentChar1)
    29. m = intPrintAreaTop - 20
    30. If intCurrentChar > intCurrentChar1 Then
    31. e.HasMorePages = True
    32. Else
    33. e.HasMorePages = False
    34. intCurrentChar = 0
    35. End If
    36. End If
    37. Next
    Hab Deine Frage nicht ganz verstanden. Brauchst Du einen Seitenzähler?

    VB.NET-Quellcode

    1. Private Seitenzähler As Integer = 1 ' die 1. Seite hat die Nummer 1
    2. ' ....
    3. e.Graphics.DrawString(Seitenzähler.ToString, ...)
    4. If intCurrentChar > intCurrentChar1 Then
    5. e.HasMorePages = True
    6. Seitenzähler += 1
    7. Else
    8. e.HasMorePages = False
    9. intCurrentChar = 0
    10. End If
    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!

    th3Khem schrieb:

    springt nicht auf seite 2 beim drucken sondern überschreibt die seite 1

    Wie darf ich mir das vorstellen?
    Beschreibst Du dasselbe (schon beschriebene) Graphics-Objekt mehrfach?
    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 Drucken funktioniert wie das Schreiben im Paint-Evenmt. Du musst jeden Text einzeln positionieren. Du musst ermitteln, wie breit und hoch ein Text ist und dem nächsten Text musst Du für die y-Koordinate die bisherige Texthöhe als Offset mitgeben.
    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!
    Erstell Dir ein neues Projekt.
    Füge hinzu einen Button (Button1) und ein PrintDocument (PrintDocument1)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. PrintDocument1.DocumentName = "TestPrintDocument"
    4. PrintDocument1.Print()
    5. End Sub
    6. Private Seitenzahlen As Integer = 5
    7. Private Seitenzahl As Integer = 1
    8. Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    9. e.Graphics.DrawString(Seitenzahl.ToString, New Font("ARIAL", 20), Brushes.Black, New Point(50, 50))
    10. e.HasMorePages = Seitenzahl < Seitenzahlen
    11. Seitenzahl += 1
    12. End Sub
    13. End Class

    Wenn Du in ein PDF druckst, kommt das angehängte Dokument bei raus.
    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!
    Dann poste doch bitte mal Deinen ganzenn Code, wenn das geht.
    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!
    so sieht er momentan aus

    VB.NET-Quellcode

    1. Static intCurrentChar As Integer = 0
    2. Dim intCurrentChar1 As Integer = 1
    3. Dim Seitenzähler As Integer = 1 ' die 1. Seite hat die Nummer 1
    4. Dim intLineDgvM As Integer = MimotProgram_DataGridView.RowCount
    5. Dim intLineDgvI As Integer = InforAuftrag_DataGridView.RowCount
    6. Dim font As New Font("Arial", 10)
    7. Dim lineoffset As Integer = 4
    8. Dim intPrintAreaTop As Integer = 250
    9. Dim intPrintAreaBottom As Integer = 1070
    10. Dim intLineCount As Int32 = CInt(((intPrintAreaBottom - intPrintAreaTop) / (font.Height + lineoffset)))
    11. Dim m As Integer = 230
    12. For i = 0 To MimotProgram_DataGridView.RowCount - 1
    13. Dim columns_bpos As String ' String deklarieren
    14. Dim columns_identnummer As String ' String deklarieren
    15. Dim columns_bezeichnung As String ' String deklarieren
    16. Dim columns_status As String ' String deklarieren
    17. columns_bpos = MimotProgram_DataGridView.Rows(i).Cells(0).Value
    18. columns_identnummer = MimotProgram_DataGridView.Rows(i).Cells(1).Value
    19. columns_bezeichnung = MimotProgram_DataGridView.Rows(i).Cells(2).Value
    20. columns_status = MimotProgram_DataGridView.Rows(i).Cells(3).Tag
    21. If (columns_bezeichnung.Length() > 15) Then
    22. columns_bezeichnung = columns_bezeichnung.Substring(0, 15)
    23. columns_bezeichnung = columns_bezeichnung & "..."
    24. End If
    25. intCurrentChar = Math.Round(intLineDgvM / intLineCount)
    26. m = m + (font.Height + lineoffset)
    27. e.Graphics.DrawString(columns_bpos, font, Brushes.Black, 63, m)
    28. e.Graphics.DrawString(columns_identnummer, font, Brushes.Black, 135, m)
    29. e.Graphics.DrawString(columns_bezeichnung, font, Brushes.Black, 225, m)
    30. If columns_status = "green" Then
    31. e.Graphics.DrawImage(My.Resources.green, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    32. Else
    33. e.Graphics.DrawImage(My.Resources.red, 375.0F, m - 6, 25.0F, 25.0F) ' Grafik zeichnen
    34. End If
    35. If m >= intPrintAreaBottom Then
    36. e.HasMorePages = intCurrentChar1 < intCurrentChar
    37. Seitenzahl += 1
    38. End If
    39. Next