Hallo hoffe das ich hier einen Lösungsansatz finde!
mit dem angehängten Code versuche ich eine ListView zu drucken.
OK, im Anhang das Preview wie es derzeit aussieht, auch werden im Preview mehrere Seiten gezeigt
Problem: es wird leider nur eine Seite gedruckt wenn ich den Druck anstoße
Lösungssuche: wie kann ich da vorgehen? wie bekomme ich da eine Überschrift und unten Seite x von xx rein und wie kann man das schön Zentriert aufs Papier bringen?
Bitte nicht jetzt vorschlagen auf DGV zu gehen..
es ist ja fast so wie ich möchte
Spoiler anzeigen
mit dem angehängten Code versuche ich eine ListView zu drucken.
OK, im Anhang das Preview wie es derzeit aussieht, auch werden im Preview mehrere Seiten gezeigt
Problem: es wird leider nur eine Seite gedruckt wenn ich den Druck anstoße
Lösungssuche: wie kann ich da vorgehen? wie bekomme ich da eine Überschrift und unten Seite x von xx rein und wie kann man das schön Zentriert aufs Papier bringen?
Bitte nicht jetzt vorschlagen auf DGV zu gehen..
es ist ja fast so wie ich möchte
Quellcode
- #Region "Print related declarations"
- Protected WithEvents pd As Printing.PrintDocument 'used by Print sub
- Protected Ratio As Single = 0, CurrRow As Integer = 0
- #End Region
- #Region "Simple Printing of ListView"
- ''' <summary>
- ''' Print the List view as a simple report
- ''' </summary>
- '''
- Public Sub Print()
- pd = New Printing.PrintDocument
- pd.DocumentName = "Print of " & ListView1.Name
- Ratio = 1
- CurrRow = 0
- pd.Print()
- End Sub
- ''' <summary>
- ''' Print Preview the List view as a simple report
- ''' </summary>
- '''
- Public Sub PrintPreview()
- pd = New Printing.PrintDocument
- pd.DocumentName = "Print of " & ListView1.Name
- pd.DefaultPageSettings.Landscape = True
- Ratio = 1
- CurrRow = 0
- Dim ppv As New PrintPreviewDialog
- ppv.Document = pd
- ppv.ShowDialog()
- End Sub
- Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
- Dim c As ColumnHeader
- Dim g As Graphics = e.Graphics
- Dim l As Integer = 0 'stores current left
- Dim iCount As Integer
- Dim f As Font = ListView1.Font
- Dim b As Brush = Brushes.Black
- Dim currentY As Integer = 0, maxY As Integer = 0
- Dim gap As Integer = 1
- Dim lvsi As ListViewItem.ListViewSubItem
- Dim colLefts(ListView1.Columns.Count) As Integer, colWidths(ListView1.Columns.Count) As Integer, idx As Integer = 0, ii As Integer
- Dim lr As RectangleF
- e.HasMorePages = False
- 'Headings
- currentY = 10
- For Each c In ListView1.Columns
- maxY = Math.Max(maxY, g.MeasureString(c.Text, f, c.Width).Height)
- colLefts(idx) = l
- colWidths(idx) = c.Width
- lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
- g.DrawString(c.Text, f, b, lr)
- l += c.Width
- idx += 1
- Next
- currentY += maxY + gap
- g.DrawLine(Pens.Black, 0, currentY, e.PageBounds.Width, currentY)
- currentY += gap
- 'Rows
- iCount = ListView1.Items.Count - 1
- For ii = CurrRow To iCount
- If (currentY + maxY + maxY) > e.PageBounds.Height Then 'jump down another line to see if this line will fit
- CurrRow = ii - 1
- e.HasMorePages = True
- Exit For 'does next page
- End If
- l = 0
- maxY = 0
- idx = 0
- For Each lvsi In ListView1.Items(ii).SubItems
- maxY = Math.Max(maxY, g.MeasureString(lvsi.Text, f, colWidths(idx)).Height)
- lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
- g.DrawString(lvsi.Text, f, b, lr)
- idx += 1
- Next
- currentY += maxY + gap
- Next
- End Sub
- #End Region