Drucken von zB. Seite 2-4

  • VB.NET
  • .NET (FX) 4.0

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

    Drucken von zB. Seite 2-4

    Hallo zusammen,

    ich möchte das der User aus einem Datagridview die zu druckenden Seiten auswählen kann.

    Mein Printdialog sieht so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim mRow As Integer = 0
    2. Dim newpage As Boolean = True
    3. Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
    4. Seite = 0
    5. End Sub
    6. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    7. With DGV_IB
    8. Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
    9. fmt.LineAlignment = StringAlignment.Center
    10. fmt.Trimming = StringTrimming.EllipsisCharacter
    11. Dim y As Single = e.MarginBounds.Top
    12. Do While mRow < .RowCount
    13. Dim row As DataGridViewRow = .Rows(mRow)
    14. Dim x As Single = e.MarginBounds.Left
    15. Dim h As Single = 0
    16. For Each cell As DataGridViewCell In row.Cells
    17. Dim _Hintergrundfarbe As Color = cell.Style.BackColor
    18. Dim myBrush As New SolidBrush(_Hintergrundfarbe)
    19. Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)
    20. e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    21. 'e.Graphics.FillRectangle(Brushes.LightGray, rc.Left + 1, rc.Top + 1, rc.Width - 1, rc.Height - 1)
    22. If (newpage) Then
    23. 'Seitenzahl
    24. e.Graphics.DrawString(String.Format("Seite {0}", Seite + 1), New Font("arial", 10, FontStyle.Regular), Brushes.Black, New Point(30, 30))
    25. 'Header grau
    26. e.Graphics.FillRectangle(Brushes.LightGray, rc.Left + 1, rc.Top + 1, rc.Width - 1, rc.Height - 1)
    27. e.Graphics.DrawString(DGV_IB.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
    28. Else
    29. 'andere Zeilen
    30. e.Graphics.FillRectangle(myBrush, rc.Left + 1, rc.Top + 1, rc.Width - 1, rc.Height - 1)
    31. e.Graphics.DrawString(DGV_IB.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
    32. End If
    33. x += rc.Width
    34. h = Math.Max(h, rc.Height)
    35. Next
    36. newpage = False
    37. y += h
    38. mRow += 1
    39. If y + h > e.MarginBounds.Bottom Then
    40. Seite = Seite + 1
    41. e.HasMorePages = Seite < 3
    42. mRow -= 1
    43. newpage = True
    44. Exit Sub
    45. End If
    46. Loop
    47. mRow = 0
    48. End With
    49. End Sub
    50. Private Sub BT_Perplex_Print_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Perplex_Print.Click
    51. Using ppd = New PrintDialog
    52. 'DirectCast(ppd.Controls(1), ToolStrip).Visible = False
    53. PrintDocument1.DefaultPageSettings.Landscape = True
    54. If ppd.ShowDialog = DialogResult.OK Then
    55. ppd.Document = PrintDocument1
    56. ppd.AllowSomePages = True
    57. PrintDocument1.Print()
    58. End If
    59. End Using
    60. End Sub



    VB.NET-Quellcode

    1. e.HasMorePages = Seite < 3

    Das Document hat 4 Seiten. Jetzt wird Seite 1-3 gedruckt. Das passt.

    Aber wenn ich nochmals auf den Button drcuken drücke wird Seite 4 gedruckt. Ich habe aber bei .BeginPrint Seite =0 :(

    Noch eine Frage:
    Wie kann ich der Printpage beibringen das zB. nur Seite 2-3 oder 2-4 gedruckt wird ?

    Vielen Dank im vorraus....
    Hallo majachen99,

    mit dem Druckvorgang selbst kenne ich mich nicht aus. Aber die Steuerung läuft doch über das Datagridview? Könntest Du für den Fall Seite x bis y nicht die Zeilen im Datagridview markieren und dann so weiter machn:

    VB.NET-Quellcode

    1. For Each Seite In DGV_IB.SelectedRows
    2. Seite.Cells(SpaltenNr).Value.ToString
    3. Next

    majachen99 schrieb:

    Seite 2-3 oder 2-4
    Du allein bist dafür verantwortlich, was gedruckt wird.
    Mach Dir eine Variable, die die Startseite druckt und eine für die Endseite.
    Du musst wissen, dass das PrintPage-Event für jede einzelne Zeile aufgerufen wird.
    Dann brauchst Du einen Zähler über diese Seiten, der auch den Abbruch generiert.
    Gugst Du hier.
    Form mit Button, PrintDocument und ChechBox, je nach CheckBox werden die Seiten 1...10 oder 3...7 gedruckt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private start As Integer ' 1. Seite
    3. Private ende As Integer ' letzte Seite
    4. Private aktuell As Integer ' aktuelle Seite
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Using dlg = New PrintPreviewDialog
    7. dlg.Document = Me.PrintDocument1
    8. dlg.ShowDialog()
    9. End Using
    10. End Sub
    11. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    12. e.Graphics.DrawString(aktuell.ToString, New Font("Arial", 20), Brushes.Black, New Point(20, 20))
    13. e.HasMorePages = aktuell < ende
    14. aktuell += 1
    15. End Sub
    16. Private Sub PrintDocument1_BeginPrint(sender As Object, e As Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
    17. If CheckBox1.Checked Then
    18. start = 3
    19. ende = 7
    20. Else
    21. start = 1
    22. ende = 10
    23. End If
    24. aktuell = start
    25. End Sub
    26. End Class
    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!