Listview print

  • VB.NET

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

    Listview print

    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

    Quellcode

    1. #Region "Print related declarations"
    2. Protected WithEvents pd As Printing.PrintDocument 'used by Print sub
    3. Protected Ratio As Single = 0, CurrRow As Integer = 0
    4. #End Region
    5. #Region "Simple Printing of ListView"
    6. ''' <summary>
    7. ''' Print the List view as a simple report
    8. ''' </summary>
    9. '''
    10. Public Sub Print()
    11. pd = New Printing.PrintDocument
    12. pd.DocumentName = "Print of " & ListView1.Name
    13. Ratio = 1
    14. CurrRow = 0
    15. pd.Print()
    16. End Sub
    17. ''' <summary>
    18. ''' Print Preview the List view as a simple report
    19. ''' </summary>
    20. '''
    21. Public Sub PrintPreview()
    22. pd = New Printing.PrintDocument
    23. pd.DocumentName = "Print of " & ListView1.Name
    24. pd.DefaultPageSettings.Landscape = True
    25. Ratio = 1
    26. CurrRow = 0
    27. Dim ppv As New PrintPreviewDialog
    28. ppv.Document = pd
    29. ppv.ShowDialog()
    30. End Sub
    31. Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
    32. Dim c As ColumnHeader
    33. Dim g As Graphics = e.Graphics
    34. Dim l As Integer = 0 'stores current left
    35. Dim iCount As Integer
    36. Dim f As Font = ListView1.Font
    37. Dim b As Brush = Brushes.Black
    38. Dim currentY As Integer = 0, maxY As Integer = 0
    39. Dim gap As Integer = 1
    40. Dim lvsi As ListViewItem.ListViewSubItem
    41. Dim colLefts(ListView1.Columns.Count) As Integer, colWidths(ListView1.Columns.Count) As Integer, idx As Integer = 0, ii As Integer
    42. Dim lr As RectangleF
    43. e.HasMorePages = False
    44. 'Headings
    45. currentY = 10
    46. For Each c In ListView1.Columns
    47. maxY = Math.Max(maxY, g.MeasureString(c.Text, f, c.Width).Height)
    48. colLefts(idx) = l
    49. colWidths(idx) = c.Width
    50. lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
    51. g.DrawString(c.Text, f, b, lr)
    52. l += c.Width
    53. idx += 1
    54. Next
    55. currentY += maxY + gap
    56. g.DrawLine(Pens.Black, 0, currentY, e.PageBounds.Width, currentY)
    57. currentY += gap
    58. 'Rows
    59. iCount = ListView1.Items.Count - 1
    60. For ii = CurrRow To iCount
    61. If (currentY + maxY + maxY) > e.PageBounds.Height Then 'jump down another line to see if this line will fit
    62. CurrRow = ii - 1
    63. e.HasMorePages = True
    64. Exit For 'does next page
    65. End If
    66. l = 0
    67. maxY = 0
    68. idx = 0
    69. For Each lvsi In ListView1.Items(ii).SubItems
    70. maxY = Math.Max(maxY, g.MeasureString(lvsi.Text, f, colWidths(idx)).Height)
    71. lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
    72. g.DrawString(lvsi.Text, f, b, lr)
    73. idx += 1
    74. Next
    75. currentY += maxY + gap
    76. Next
    77. End Sub
    78. #End Region
    Bilder
    • LV_Print.JPG

      81,07 kB, 665×546, 327 mal angesehen
    Schau mal was in deinem PrintPage-Eventhandler drinsteht:

    menorca schrieb:

    e.HasMorePages = False

    Das dürfte erklären, warum du - egal was du machst - immer nur eine Seite bekommst.

    Ein bisschen Hintergrund:
    Das PrintPage-Event wird für dein PrintDocument exakt ein Mal aufgerufen und übergibt dir den Graphics-Kontext für exakt eine Seite.
    Egal wie weiter du über den druckbaren Bereich des Graphics-Kontext hinaus Ausgaben tätigst, sie werden beim Ausdruck entsprechend geclippt (verschwinden also im Nirvana) und es bleibt bei einer Seite.
    Wenn du in e.HasMorePages aber den Wert True einträgst bevor der Handler beendet wird, weiß das Druck-Subsystem: Aha, das Programm hat doch mehr als eine Seite zu drucken. Also wird dann der Druck für die nächste Seite angestoßen, was wiederum das PrintPage-Event auslöst.
    Deine Aufgabe ist es nun, nachzuhalten, was du bereits auf der ersten Seite unterbringen konntest und was demnach für die zweite Seite (oder weitere) übriggeblieben ist, und dann zu entscheiden ob du jeweils noch eine zusätzliche Seite brauchst. Sobald in e.HasMorePages False drin steht (stehen bleibt), wird für PrintDocument keine weitere Seite mehr angestoßen und der Druckauftrag abschließend verarbeitet.

    Ich hoffe, das hilft dir etwas weiter, dich im PrintDocument-Gewusel zurecht zu finden.

    Hier übrigens mal ein Beispiel aus einem meiner Programme, etwas "vereinfacht":
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub OnBeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles m_PrintDocument.BeginPrint
    2. m_MaxPageY = 0
    3. m_MaxPageX = 0
    4. m_CurrentPageX = 0
    5. m_CurrentPageY = 0
    6. End Sub
    7. Private Sub OnQueryPageSettings(ByVal sender As Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles m_PrintDocument.QueryPageSettings
    8. If m_MaxPageY = 0 Then
    9. Dim Pages = GetPageCount(m_PrintScale) '<-- eigene Funktion die die Anzahl Seiten auf Basis eines Zoomfaktors bestimmt
    10. m_MaxPageX = Pages.HorizontalPages
    11. m_MaxPageY = Pages.VerticalPages
    12. End If
    13. End Sub
    14. Private Sub OnPrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles m_PrintDocument.PrintPage
    15. Dim PageSize As SizeF = e.PageSettings.PrintableArea.Size
    16. If e.PageSettings.Landscape Then
    17. PageSize = New SizeF(PageSize.Height, PageSize.Width)
    18. End If
    19. ' In OnPrint wird hier einfach die komplette (in diesem Fall) Grafik ausgegeben, mit Hilfe
    20. ' von TranslateTransform verschiebe ich den Ausgabebereich nur entsprechend so, dass
    21. ' im druckbaren Bereich jeweils der zur Seite passende Bereich der Grafik zu liegen kommt.
    22. e.Graphics.TranslateTransform(-m_CurrentPageX * PageSize.Width, -m_CurrentPageY * PageSize.Height)
    23. OnPrint(e.Graphics, m_PrintScale)
    24. 'Nachhalten welche Seite grad gedruckt wurde und welche als nächstes drankommt
    25. m_CurrentPageX += 1
    26. If m_CurrentPageX >= m_MaxPageX Then
    27. m_CurrentPageX = 0
    28. m_CurrentPageY += 1
    29. End If
    30. e.HasMorePages = (m_CurrentPageY < m_MaxPageY)
    31. End Sub
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()

    Okay, hab jetzt auch gesehen, dass du HasMorePages an einer anderen Stelle doch auf True setzt. Ich kann zwar jetzt ohne deinen Code direkt zu testen keinen Fehler erkennen, aber ich würde dir empfehlen, in deinem PrintPage-Handler mehrere Haltepunkte zu setzen, z.B. einen direkt auf der ersten Zeile, um zu sehen wie oft er überhaupt aufgerufen wird, und einen auf die Zeile, wo e.HasMorePages auf True gesetzt wird, um zu prüfen, ob er dort überhaupt hinkommt. Und dann beim Durchsteppen mal überprüfen, ob wirklich alles so durchläuft wie der Fluss es erwartet oder ob nicht vielleicht doch irgendwo eine Exception auslöst, die deine PrintPage-Methode vorzeitig abbricht.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    ListView Print (Überschrift + Fusszeile mit Seite 1 von 3) etc

    Hallo zusammen,

    habe nun noch mals recherchiert und bin im Grunde mit der Print Klasse PrintListView im Anhang zufrieden!
    bekomme dort allerdings nicht hin eine Überschrift einzubauen, und Seitenanzahl Fusszeile fehlt noch.
    wer hat da eine Idee, wie ich das einbinden kann? Die Überschrift soll Links Bündig mit der Liste sein
    evtl. aus Elementen (Textbox) oder so kommen.

    die Seitenanzahl Mittig 'Seite x von xx' rechts benötige ich noch einen Fusszeilentext wie erstellt am: 02.11.2013 von menorca

    bevor man in Printpreview die Vorschau sieht, sollte man einen Drucker auswählen können und dann drucken oder Vorschau wählen

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class PrintListView
    2. Private LV As ListView
    3. Private SpaltenBreite As New List(Of Integer)
    4. Private TextHöhe As Integer
    5. Private OffsetSpalte As Integer
    6. Private OffsetZeile As Integer
    7. Private MerkerSpalte As Integer
    8. Private MerkerZeile As Integer
    9. Public HeaderColor As System.Drawing.Color = Color.LightSeaGreen
    10. Private WithEvents PD As New System.Drawing.Printing.PrintDocument
    11. Private PrintPrev As New System.Windows.Forms.PrintPreviewDialog
    12. Private asc As SizeColumn = SizeColumn.None
    13. Public Enum SizeColumn
    14. None
    15. ScretchColumn
    16. AutoSitze
    17. End Enum
    18. Private _listView As ListView
    19. Private _headerText As String
    20. Sub New(ByVal listView As ListView, ByVal HeaderText As String)
    21. ' TODO: Complete member initialization
    22. _listView = listView
    23. _headerText = HeaderText
    24. End Sub
    25. Public Property AutoSizeColumn() As SizeColumn
    26. Get
    27. Return asc
    28. End Get
    29. Set(ByVal value As SizeColumn)
    30. asc = value
    31. SizeColums()
    32. End Set
    33. End Property
    34. Public Property Landscape() As Boolean
    35. Get
    36. Return PD.DefaultPageSettings.Landscape
    37. End Get
    38. Set(ByVal value As Boolean)
    39. PD.DefaultPageSettings.Landscape = value
    40. SizeColums()
    41. End Set
    42. End Property
    43. Private Sub SizeColums()
    44. Dim breite As Integer
    45. Dim g As Graphics = LV.CreateGraphics
    46. Dim zähler As Integer
    47. SpaltenBreite.Clear()
    48. Select Case asc
    49. Case SizeColumn.None, SizeColumn.AutoSitze
    50. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    51. SpaltenBreite.Add(CH.Width)
    52. Next
    53. Case SizeColumn.AutoSitze, SizeColumn.AutoSitze
    54. If asc = SizeColumn.AutoSitze Then
    55. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    56. breite = g.MeasureString(CH.Text, LV.Font).Width + 15
    57. SpaltenBreite.Add(breite)
    58. Next
    59. End If
    60. For Each LVI As ListViewItem In LV.Items
    61. zähler = 0
    62. breite = g.MeasureString(LVI.Text, LV.Font).Width + 15
    63. If asc = SizeColumn.AutoSitze Then SpaltenBreite.Add(breite)
    64. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    65. For Each LVSI As ListViewItem.ListViewSubItem In LVI.SubItems
    66. breite = g.MeasureString(LVSI.Text, LV.Font).Width + 20
    67. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    68. zähler += 1
    69. Next
    70. Next
    71. End Select
    72. End Sub
    73. Public Sub New()
    74. End Sub
    75. Public Sub New(ByVal ListViewToPrint As ListView)
    76. LV = ListViewToPrint
    77. Dim g As Graphics = LV.CreateGraphics
    78. TextHöhe = g.MeasureString("XyZ1!", LV.Font).Height + 54
    79. SizeColums()
    80. SpaltenBreite.Add(0)
    81. g.Dispose()
    82. End Sub
    83. Public Sub Print()
    84. PD.Print()
    85. End Sub
    86. Public Sub Preview()
    87. PD.DefaultPageSettings.Landscape = True
    88. PrintPrev.Document = PD
    89. PrintPrev.WindowState = FormWindowState.Maximized
    90. PrintPrev.ShowDialog()
    91. End Sub
    92. Private Sub PD_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD.PrintPage
    93. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    94. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
    95. Dim left As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Left
    96. Dim right As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Right
    97. Dim top As Decimal = 100.0 ' PD.DefaultPageSettings.Margins.Top
    98. Dim bottom As Decimal = PD.DefaultPageSettings.Margins.Bottom
    99. Dim PageWidth As Integer = PD.DefaultPageSettings.Bounds.Width - (right + left)
    100. Dim PageHeight As Decimal = PD.DefaultPageSettings.Bounds.Height - (top + bottom)
    101. Dim sf As New StringFormat
    102. sf.Alignment = StringAlignment.Center
    103. sf.LineAlignment = StringAlignment.Center
    104. Dim rf As New Rectangle
    105. Dim br As SolidBrush
    106. Dim br1 As SolidBrush
    107. Dim PosX As Integer = left
    108. Dim PosY As Integer = top
    109. Dim OffsetSpalte As Integer
    110. Dim OffsetZeile As Integer
    111. ' Header schreiben
    112. Do
    113. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    114. e.Graphics.FillRectangle(New SolidBrush(HeaderColor), rf)
    115. If LV.GridLines Then e.Graphics.DrawRectangle(Pens.Black, rf.X, rf.Y, rf.Width, rf.Height)
    116. e.Graphics.DrawString(LV.Columns(OffsetSpalte + MerkerSpalte).Text, LV.Font, Brushes.Black, rf, sf)
    117. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    118. OffsetSpalte += 1
    119. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte > LV.Columns.Count - 1
    120. PosX = left
    121. OffsetSpalte = 0
    122. OffsetZeile = 0
    123. Do
    124. OffsetZeile = 0
    125. PosY = top + TextHöhe
    126. Do
    127. If (LV.Items(OffsetZeile + MerkerZeile).SubItems.Count > OffsetSpalte + MerkerSpalte) Then
    128. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    129. If LV.Items(OffsetZeile + MerkerZeile).UseItemStyleForSubItems = True Then
    130. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).BackColor)
    131. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).ForeColor)
    132. Else
    133. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).BackColor)
    134. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).ForeColor)
    135. End If
    136. e.Graphics.FillRectangle(br, rf)
    137. If LV.GridLines Then e.Graphics.DrawRectangle(New Pen(LV.ForeColor), rf)
    138. Select Case LV.Columns(OffsetSpalte + MerkerSpalte).TextAlign
    139. Case HorizontalAlignment.Center
    140. sf.Alignment = StringAlignment.Center
    141. Case HorizontalAlignment.Left
    142. sf.Alignment = StringAlignment.Near
    143. Case HorizontalAlignment.Right
    144. sf.Alignment = StringAlignment.Far
    145. End Select
    146. e.Graphics.DrawString(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).Text, LV.Font, br1, rf, sf)
    147. End If
    148. PosY += TextHöhe
    149. OffsetZeile += 1
    150. Loop Until PageHeight + top < PosY + TextHöhe Or OffsetZeile + MerkerZeile >= LV.Items.Count
    151. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    152. OffsetSpalte += 1
    153. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte >= LV.Columns.Count
    154. If OffsetSpalte + MerkerSpalte = LV.Columns.Count And OffsetZeile + MerkerZeile = LV.Items.Count Then
    155. e.HasMorePages = False
    156. MerkerZeile = 0
    157. MerkerSpalte = 0
    158. OffsetSpalte = 0
    159. OffsetZeile = 0
    160. Exit Sub
    161. End If
    162. If OffsetZeile + MerkerZeile < LV.Items.Count Then
    163. MerkerZeile = OffsetZeile + MerkerZeile
    164. e.HasMorePages = True
    165. Exit Sub
    166. End If
    167. If MerkerSpalte = OffsetSpalte < LV.Columns.Count Then
    168. MerkerSpalte = OffsetSpalte + MerkerSpalte
    169. MerkerZeile = 0
    170. e.HasMorePages = True
    171. Exit Sub
    172. End If
    173. End Sub
    174. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „menorca“ () aus folgendem Grund: Erklärungen hinzugefügt

    ListView Print (Überschrift + Fusszeile mit Seite 1 von 3) etc

    Hallo zusammen,

    habe nun noch mals recherchiert und bin im Grunde mit dem Code im Anhang zufrieden!
    bekomme dort allerdings nicht hin eine Überschrift einzubauen, und Seitenanzahl Fusszeile fehlt noch.
    wer hat da eine Idee, wie ich das einbinden kann?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class PrintListView
    2. Private LV As ListView
    3. Private SpaltenBreite As New List(Of Integer)
    4. Private TextHöhe As Integer
    5. Private OffsetSpalte As Integer
    6. Private OffsetZeile As Integer
    7. Private MerkerSpalte As Integer
    8. Private MerkerZeile As Integer
    9. Public HeaderColor As System.Drawing.Color = Color.LightSeaGreen
    10. Private WithEvents PD As New System.Drawing.Printing.PrintDocument
    11. Private PrintPrev As New System.Windows.Forms.PrintPreviewDialog
    12. Private asc As SizeColumn = SizeColumn.None
    13. Public Enum SizeColumn
    14. None
    15. ScretchColumn
    16. AutoSitze
    17. End Enum
    18. Private _listView As ListView
    19. Private _headerText As String
    20. Sub New(ByVal listView As ListView, ByVal HeaderText As String)
    21. ' TODO: Complete member initialization
    22. _listView = listView
    23. _headerText = HeaderText
    24. End Sub
    25. Public Property AutoSizeColumn() As SizeColumn
    26. Get
    27. Return asc
    28. End Get
    29. Set(ByVal value As SizeColumn)
    30. asc = value
    31. SizeColums()
    32. End Set
    33. End Property
    34. Public Property Landscape() As Boolean
    35. Get
    36. Return PD.DefaultPageSettings.Landscape
    37. End Get
    38. Set(ByVal value As Boolean)
    39. PD.DefaultPageSettings.Landscape = value
    40. SizeColums()
    41. End Set
    42. End Property
    43. Private Sub SizeColums()
    44. Dim breite As Integer
    45. Dim g As Graphics = LV.CreateGraphics
    46. Dim zähler As Integer
    47. SpaltenBreite.Clear()
    48. Select Case asc
    49. Case SizeColumn.None, SizeColumn.AutoSitze
    50. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    51. SpaltenBreite.Add(CH.Width)
    52. Next
    53. Case SizeColumn.AutoSitze, SizeColumn.AutoSitze
    54. If asc = SizeColumn.AutoSitze Then
    55. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    56. breite = g.MeasureString(CH.Text, LV.Font).Width + 15
    57. SpaltenBreite.Add(breite)
    58. Next
    59. End If
    60. For Each LVI As ListViewItem In LV.Items
    61. zähler = 0
    62. breite = g.MeasureString(LVI.Text, LV.Font).Width + 15
    63. If asc = SizeColumn.AutoSitze Then SpaltenBreite.Add(breite)
    64. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    65. For Each LVSI As ListViewItem.ListViewSubItem In LVI.SubItems
    66. breite = g.MeasureString(LVSI.Text, LV.Font).Width + 20
    67. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    68. zähler += 1
    69. Next
    70. Next
    71. End Select
    72. End Sub
    73. Public Sub New()
    74. End Sub
    75. Public Sub New(ByVal ListViewToPrint As ListView)
    76. LV = ListViewToPrint
    77. Dim g As Graphics = LV.CreateGraphics
    78. TextHöhe = g.MeasureString("XyZ1!", LV.Font).Height + 54
    79. SizeColums()
    80. SpaltenBreite.Add(0)
    81. g.Dispose()
    82. End Sub
    83. Public Sub Print()
    84. PD.Print()
    85. End Sub
    86. Public Sub Preview()
    87. PD.DefaultPageSettings.Landscape = True
    88. PrintPrev.Document = PD
    89. PrintPrev.WindowState = FormWindowState.Maximized
    90. PrintPrev.ShowDialog()
    91. End Sub
    92. Private Sub PD_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD.PrintPage
    93. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    94. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
    95. Dim left As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Left
    96. Dim right As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Right
    97. Dim top As Decimal = 100.0 ' PD.DefaultPageSettings.Margins.Top
    98. Dim bottom As Decimal = PD.DefaultPageSettings.Margins.Bottom
    99. Dim PageWidth As Integer = PD.DefaultPageSettings.Bounds.Width - (right + left)
    100. Dim PageHeight As Decimal = PD.DefaultPageSettings.Bounds.Height - (top + bottom)
    101. Dim sf As New StringFormat
    102. sf.Alignment = StringAlignment.Center
    103. sf.LineAlignment = StringAlignment.Center
    104. Dim rf As New Rectangle
    105. Dim br As SolidBrush
    106. Dim br1 As SolidBrush
    107. Dim PosX As Integer = left
    108. Dim PosY As Integer = top
    109. Dim OffsetSpalte As Integer
    110. Dim OffsetZeile As Integer
    111. ' Header schreiben
    112. Do
    113. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    114. e.Graphics.FillRectangle(New SolidBrush(HeaderColor), rf)
    115. If LV.GridLines Then e.Graphics.DrawRectangle(Pens.Black, rf.X, rf.Y, rf.Width, rf.Height)
    116. e.Graphics.DrawString(LV.Columns(OffsetSpalte + MerkerSpalte).Text, LV.Font, Brushes.Black, rf, sf)
    117. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    118. OffsetSpalte += 1
    119. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte > LV.Columns.Count - 1
    120. PosX = left
    121. OffsetSpalte = 0
    122. OffsetZeile = 0
    123. Do
    124. OffsetZeile = 0
    125. PosY = top + TextHöhe
    126. Do
    127. If (LV.Items(OffsetZeile + MerkerZeile).SubItems.Count > OffsetSpalte + MerkerSpalte) Then
    128. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    129. If LV.Items(OffsetZeile + MerkerZeile).UseItemStyleForSubItems = True Then
    130. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).BackColor)
    131. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).ForeColor)
    132. Else
    133. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).BackColor)
    134. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).ForeColor)
    135. End If
    136. e.Graphics.FillRectangle(br, rf)
    137. If LV.GridLines Then e.Graphics.DrawRectangle(New Pen(LV.ForeColor), rf)
    138. Select Case LV.Columns(OffsetSpalte + MerkerSpalte).TextAlign
    139. Case HorizontalAlignment.Center
    140. sf.Alignment = StringAlignment.Center
    141. Case HorizontalAlignment.Left
    142. sf.Alignment = StringAlignment.Near
    143. Case HorizontalAlignment.Right
    144. sf.Alignment = StringAlignment.Far
    145. End Select
    146. e.Graphics.DrawString(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).Text, LV.Font, br1, rf, sf)
    147. End If
    148. PosY += TextHöhe
    149. OffsetZeile += 1
    150. Loop Until PageHeight + top < PosY + TextHöhe Or OffsetZeile + MerkerZeile >= LV.Items.Count
    151. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    152. OffsetSpalte += 1
    153. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte >= LV.Columns.Count
    154. If OffsetSpalte + MerkerSpalte = LV.Columns.Count And OffsetZeile + MerkerZeile = LV.Items.Count Then
    155. e.HasMorePages = False
    156. MerkerZeile = 0
    157. MerkerSpalte = 0
    158. OffsetSpalte = 0
    159. OffsetZeile = 0
    160. Exit Sub
    161. End If
    162. If OffsetZeile + MerkerZeile < LV.Items.Count Then
    163. MerkerZeile = OffsetZeile + MerkerZeile
    164. e.HasMorePages = True
    165. Exit Sub
    166. End If
    167. If MerkerSpalte = OffsetSpalte < LV.Columns.Count Then
    168. MerkerSpalte = OffsetSpalte + MerkerSpalte
    169. MerkerZeile = 0
    170. e.HasMorePages = True
    171. Exit Sub
    172. End If
    173. End Sub
    174. End Class

    menorca schrieb:

    bekomme dort allerdings nicht hin eine Überschrift einzubauen, und Seitenanzahl Fusszeile fehlt noch.
    Dann fang mit der Überschrift und der Fußzeile an:

    VB.NET-Quellcode

    1. Private pageNumber As Integer
    2. Private actPage As Integer
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Me.actPage = 1
    5. Me.pageNumber = 5
    6. Me.PrintPreviewDialog1.ShowDialog()
    7. End Sub
    8. Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    9. e.Graphics.DrawString(String.Format("Dies ist die Überschrift der {0}. Seite", Me.actPage), New Font("Arial", 20), Brushes.Black, New Point(30, 30))
    10. e.Graphics.DrawString(String.Format("Seite {0} von {1}", Me.actPage, Me.pageNumber), New Font("Arial", 10), Brushes.Black, New Point(30, PrintDocument1.DefaultPageSettings.Bounds.Height - 30))
    11. e.HasMorePages = Me.actPage < Me.pageNumber
    12. Me.actPage += 1
    13. End Sub
    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!
    Hallo Rod,

    Danke, für deine Antwort!

    ich habe es so probiert ---> im Code Rote Schriftfarbe (mir gefällt das Brush nicht der Text sieht dann so verschmiert aus) na ja man kann nicht alles haben...
    kann das im Prinzip so bleiben? da es ja funktioniert, dann hätte ich nur noch das Problem mit der Seitenzahl
    ich bin noch nicht dazu gekommen zu verstehen wie die Seiten gezählt werden

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class PrintListView
    4. Private LV As ListView
    5. Private SpaltenBreite As New List(Of Integer)
    6. Private TextHöhe As Integer
    7. Private OffsetSpalte As Integer
    8. Private OffsetZeile As Integer
    9. Private MerkerSpalte As Integer
    10. Private MerkerZeile As Integer
    11. Public HeaderColor As System.Drawing.Color = Color.LightSkyBlue
    12. Private WithEvents PD As New System.Drawing.Printing.PrintDocument
    13. Private PrintPrev As New System.Windows.Forms.PrintPreviewDialog
    14. Private asc As SizeColumn = SizeColumn.None
    15. Public Enum SizeColumn
    16. None
    17. ScretchColumn
    18. AutoSitze
    19. End Enum
    20. Private _listView As ListView
    21. Private _headerText As String
    22. Sub New(ByVal listView As ListView, ByVal HeaderText As String)
    23. ' TODO: Complete member initialization
    24. _listView = listView
    25. _headerText = HeaderText
    26. End Sub
    27. Public Property AutoSizeColumn() As SizeColumn
    28. Get
    29. Return asc
    30. End Get
    31. Set(ByVal value As SizeColumn)
    32. asc = value
    33. SizeColums()
    34. End Set
    35. End Property
    36. Public Property Landscape() As Boolean
    37. Get
    38. Return PD.DefaultPageSettings.Landscape
    39. End Get
    40. Set(ByVal value As Boolean)
    41. PD.DefaultPageSettings.Landscape = value
    42. SizeColums()
    43. End Set
    44. End Property
    45. Private Sub SizeColums()
    46. Dim breite As Integer
    47. Dim g As Graphics = LV.CreateGraphics
    48. Dim zähler As Integer
    49. SpaltenBreite.Clear()
    50. Select Case asc
    51. Case SizeColumn.None, SizeColumn.AutoSitze
    52. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    53. SpaltenBreite.Add(CH.Width)
    54. Next
    55. Case SizeColumn.AutoSitze, SizeColumn.AutoSitze
    56. If asc = SizeColumn.AutoSitze Then
    57. For Each CH As Windows.Forms.ColumnHeader In LV.Columns
    58. breite = g.MeasureString(CH.Text, LV.Font).Width + 20
    59. SpaltenBreite.Add(breite)
    60. Next
    61. End If
    62. For Each LVI As ListViewItem In LV.Items
    63. zähler = 0
    64. breite = g.MeasureString(LVI.Text, LV.Font).Width + 20
    65. If asc = SizeColumn.AutoSitze Then SpaltenBreite.Add(breite)
    66. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    67. For Each LVSI As ListViewItem.ListViewSubItem In LVI.SubItems
    68. breite = g.MeasureString(LVSI.Text, LV.Font).Width + 20
    69. If SpaltenBreite(zähler) + 20 < breite Then SpaltenBreite(zähler) = breite
    70. zähler += 1
    71. Next
    72. Next
    73. End Select
    74. End Sub
    75. Public Sub New()
    76. End Sub
    77. Public Sub New(ByVal ListViewToPrint As ListView)
    78. LV = ListViewToPrint
    79. Dim g As Graphics = LV.CreateGraphics
    80. TextHöhe = g.MeasureString("XyZ1!", LV.Font).Height + 60
    81. SizeColums()
    82. SpaltenBreite.Add(0)
    83. g.Dispose()
    84. End Sub
    85. Public Sub Print()
    86. PD.Print()
    87. End Sub
    88. Public Sub Preview()
    89. PD.DefaultPageSettings.Landscape = True
    90. PrintPrev.Document = PD
    91. PrintPrev.WindowState = FormWindowState.Maximized
    92. PrintPrev.ShowDialog()
    93. End Sub
    94. Private Sub PD_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PD.PrintPage
    95. ' --->
    96. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    97. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
    98. Dim left As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Left
    99. Dim right As Decimal = 20.5 ' PD.DefaultPageSettings.Margins.Right
    100. Dim top As Decimal = 100.0 ' PD.DefaultPageSettings.Margins.Top
    101. Dim bottom As Decimal = PD.DefaultPageSettings.Margins.Bottom
    102. Dim PageWidth As Integer = PD.DefaultPageSettings.Bounds.Width - (right + left)
    103. Dim PageHeight As Decimal = PD.DefaultPageSettings.Bounds.Height - (top + bottom)
    104. Dim sf As New StringFormat
    105. sf.Alignment = StringAlignment.Center
    106. sf.LineAlignment = StringAlignment.Center
    107. Dim rf As New Rectangle
    108. Dim br As SolidBrush
    109. Dim br1 As SolidBrush
    110. Dim PosX As Integer = left
    111. Dim PosY As Integer = top
    112. Dim OffsetSpalte As Integer
    113. Dim OffsetZeile As Integer
    114. 'Anfang und Ende der horizontalen Linien
    115. Dim yA As Decimal = 20.5
    116. Dim yE As Decimal = 60.0
    117. 'Beginn Druck, Überschriften ausgeben
    118. Dim ueberschrift1 As String = "|Streifenliste| " & Form1.Label1.Text
    119. Dim ueberschrift2 As String = Form1.cboMaschinenName.Text & " | " & Form1.VonDatum.Text & " - " & Form1.BisDatum.Text
    120. Dim ueberschrift3 As String = "Erstellt am: " & Now.ToLongDateString
    121. ' Header schreiben
    122. Do
    123. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    124. e.Graphics.FillRectangle(New SolidBrush(HeaderColor), rf)
    125. If LV.GridLines Then e.Graphics.DrawRectangle(Pens.Black, rf.X, rf.Y, rf.Width, rf.Height)
    126. e.Graphics.DrawString(ueberschrift1, New Font("Arial", 10, FontStyle.Regular), Brushes.ForestGreen, yA, 25)
    127. e.Graphics.DrawString(ueberschrift2, New Font("Arial", 10, FontStyle.Regular), Brushes.Blue, yA, yE)
    128. e.Graphics.DrawString(LV.Columns(OffsetSpalte + MerkerSpalte).Text, LV.Font, Brushes.Black, rf, sf)
    129. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    130. OffsetSpalte += 1
    131. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte > LV.Columns.Count - 1
    132. PosX = left
    133. OffsetSpalte = 0
    134. OffsetZeile = 0
    135. Do
    136. OffsetZeile = 0
    137. PosY = top + TextHöhe
    138. Do
    139. If (LV.Items(OffsetZeile + MerkerZeile).SubItems.Count > OffsetSpalte + MerkerSpalte) Then
    140. rf = New Rectangle(PosX, PosY, SpaltenBreite(OffsetSpalte + MerkerSpalte), TextHöhe)
    141. If LV.Items(OffsetZeile + MerkerZeile).UseItemStyleForSubItems = True Then
    142. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).BackColor)
    143. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).ForeColor)
    144. Else
    145. br = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).BackColor)
    146. br1 = New SolidBrush(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).ForeColor)
    147. End If
    148. e.Graphics.FillRectangle(br, rf)
    149. If LV.GridLines Then e.Graphics.DrawRectangle(New Pen(LV.ForeColor), rf)
    150. Select Case LV.Columns(OffsetSpalte + MerkerSpalte).TextAlign
    151. Case HorizontalAlignment.Center
    152. sf.Alignment = StringAlignment.Center
    153. Case HorizontalAlignment.Center
    154. sf.Alignment = StringAlignment.Center
    155. Case HorizontalAlignment.Center
    156. sf.Alignment = StringAlignment.Center
    157. End Select
    158. e.Graphics.DrawString(LV.Items(OffsetZeile + MerkerZeile).SubItems(OffsetSpalte + MerkerSpalte).Text, LV.Font, br1, rf, sf)
    159. e.Graphics.DrawString(ueberschrift3, New Font("Arial", 8, FontStyle.Regular), Brushes.Blue, yA, PageHeight + 150)
    160. End If
    161. PosY += TextHöhe
    162. OffsetZeile += 1
    163. Loop Until PageHeight + top < PosY + TextHöhe Or OffsetZeile + MerkerZeile >= LV.Items.Count
    164. PosX += SpaltenBreite(OffsetSpalte + MerkerSpalte)
    165. OffsetSpalte += 1
    166. Loop Until PageWidth + left < PosX + SpaltenBreite(OffsetSpalte + MerkerSpalte) Or OffsetSpalte + MerkerSpalte >= LV.Columns.Count
    167. If OffsetSpalte + MerkerSpalte = LV.Columns.Count And OffsetZeile + MerkerZeile = LV.Items.Count Then
    168. e.HasMorePages = False
    169. MerkerZeile = 0
    170. MerkerSpalte = 0
    171. OffsetSpalte = 0
    172. OffsetZeile = 0
    173. Exit Sub
    174. End If
    175. If OffsetZeile + MerkerZeile < LV.Items.Count Then
    176. MerkerZeile = OffsetZeile + MerkerZeile
    177. e.HasMorePages = True
    178. Exit Sub
    179. End If
    180. If MerkerSpalte = OffsetSpalte < LV.Columns.Count Then
    181. MerkerSpalte = OffsetSpalte + MerkerSpalte
    182. MerkerZeile = 0
    183. e.HasMorePages = True
    184. Exit Sub
    185. End If
    186. End Sub
    187. End Class

    menorca schrieb:

    ich bin noch nicht dazu gekommen zu verstehen wie die Seiten gezählt werden
    Deinen Code zu analysieren hab ich wirklich keine Lust.
    Du schreibst einfach von oben nach unten, sieh Dir mal die Graphics.DrawString()-Methoden an, in denen Rectangle vorkommt. Wenn Dein Text zu lang wird, beginne eine neue Seite.
    ----
    Fang doch ganz einfach an, indem Du Zeilenzahlen druckst. Wenn Du das kannst, sollte das andere auch funktionieren.
    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!
    Hallo Rod,

    sieh Dir mal die Graphics.DrawString()-Methoden an, in denen Rectangle vorkommt. Wenn Dein Text zu lang wird, beginne eine neue Seite.
    habe dein Zitat nicht ganz verstanden, oder hast du heute mehr Lust den Code zu analysieren.
    oder ist da noch jemand der mir weiter hilft, habe mal eine Testmappe hochgeladen.
    beim Start gibts eine kleine Fehlermeldung, doch mit weiter startet die Anwendung dann doch.
    evtl. kann mir da so einer weiterhelfen
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „menorca“ () aus folgendem Grund: Testmappe hochgeladen

    Hallo an Alle,

    wer hilft mir ich komme da nicht weiter!

    hiermit erreiche ich eine Seitenzahl 1-xx, aber das Ergebnis Seite 1 von xx ist falsch

    VB.NET-Quellcode

    1. ' ---> Rundenzähler
    2. Me.pageNumber = 1
    3. Me.pageNumber = Me.pageNumber + 1
    4. ' ---> Seitennummerierung ermitteln
    5. e.HasMorePages = Me.actPage < Me.pageNumber
    6. Me.actPage += 1
    Bilder
    • Seite x von xx.JPG

      13 kB, 311×179, 202 mal angesehen

    menorca schrieb:

    sieh Dir mal die Graphics.DrawString()-Methoden an, in denen Rectangle vorkommt. Wenn Dein Text zu lang wird, beginne eine neue Seite.
    habe dein Zitat nicht ganz verstanden, ...
    Was gibts da nicht zu verstehen?
    2 Stichworte sind dir gegeben, und als Programmierer musst du imstande sein, zu recherchieren, wasses damit auf sich hat.
    Sonst kannst du nicht programmieren.

    Visual-Studio richtig nutzen

    menorca schrieb:

    habe dein Zitat nicht ganz verstanden
    Schmeiß Deinen Code volständig weg.
    Mach Dir einen Rahmen anhand meines Beispielcodes und fang dann an, Deine Tabelle da reinzumalen.
    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 einfach gebe ich aber nicht auf!

    Danke an alle die hier so super geholfen haben...
    Thema erledigt, OK nicht ganz wie ich wollte doch es funktioniert auch die Seitennummerierung Seite 1, Seite 2, Seite 3 usw.
    wird auch ordentlich gedruckt, vorher falsch.

    Tolle Hilfe hier .....

    Sorry Rod, aber wird volständig nicht so --> vollständig geschrieben
    Bilder
    • Seite x von xx.JPG

      135,73 kB, 1.221×856, 247 mal angesehen

    menorca schrieb:

    aber wird volständig nicht so --> vollständig geschrieben
    :?: :?: :?:
    Es wird genau das ausgegeben, was Du im Print-Ereignis "malst".
    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!

    menorca schrieb:

    Sorry Rod, aber wird volständig nicht so --> vollständig geschrieben

    Warum findest du es wichtig einen Vertipper zu kommentieren? Der deutlich als solcher zu erkennen ist?

    menorca schrieb:

    Danke an alle die hier so super geholfen haben...

    Wird das nicht mit Komma zwischen "alle" und "die" geschrieben?

    menorca schrieb:

    Thema erledigt, OK nicht ganz wie ich wollte doch es funktioniert auch die Seitennummerierung Seite 1, Seite 2, Seite 3 usw.

    Fehlen hier nicht Kommata nach "OK", "wollte" und "funktioniert"?
    Noch Beispiele gefällig?