Drucken eines beliebig breiten Datagridview

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Drucken eines beliebig breiten Datagridview

    Hallo Gemeinde,

    aus diversen Hilfen habe ich es geschafft den Inhalt des Datagridview zu drucken.

    Das geht jedoch nur, wenn die Breite des Datagridview kleiner ist, als der Druckbereich.

    Leider habe ich beliebig breite Tabellen, welche definitiv über den Druckberich hinaus gehen.

    Die Hilfe muss sich nicht auf das untere Beispiel erstrecken. Eine andere Lösung wäre auch vollkommen in Ordnung.

    *******************************

    Die Form = F_Datenblatt_beliebiger_Filter

    Datagridview = DGV_Bleiebige_Tabellen

    Drucken und vorschau werden durch ein ToolStripMenu angesprochen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Imports System.Data
    3. Imports System.Data.Common
    4. Imports System.Data.Odbc
    5. Imports System.Data.Sql
    6. Imports System.Data.SqlTypes
    7. Imports System.Data.SqlClient
    8. Imports System
    9. Imports Microsoft.VisualBasic
    10. Public Class F_Datenblatt_beliebiger_Filter
    11. #Region "Drucken"
    12. Private SpaltenBreiten As New List(Of Integer) ' Auflistung mit der Breite der einzelnen Spalten
    13. Private TextHöhe As Integer
    14. Private DruckSpalte As Integer
    15. Private DruckZeile As Integer
    16. Private DGVSpaltenIndex As Integer
    17. Private DGVZeilenIndex As Integer
    18. Private DGVDruckbreite As IntegerPrivate ZellPadding As Integer = 5
    19. Private Querformat As Boolean = TruePublic HeaderColor As System.Drawing.Color = Color.LightGray
    20. Public RowColor As System.Drawing.Color = Color.WhitePublic RowColorAlternate As System.Drawing.Color = Color.LightYellow
    21. Public HZentrieren As Boolean = True
    22. Public DruckeGitternetzlinien As Boolean = True
    23. Public SpaltenAutoSize As Boolean = False
    24. Private WithEvents PrintDoc As New System.Drawing.Printing.PrintDocument
    25. Private PrintPrev As New System.Windows.Forms.PrintPreviewDialogPrivate Sub DruckenTabelleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenTabelleToolStripMenuItem.Click
    26. '*******************************************************************************************************
    27. '*** ***
    28. '*** Druckausgabe für eine beliebige Auswertung ***
    29. '*** ***
    30. '*** für F_Datenblatt_beliebiger_Filter.vb ***
    31. '*** ***
    32. '*******************************************************************************************************
    33. PrintDoc.DefaultPageSettings.Landscape = Querformat
    34. SpaltenAutoSize = False
    35. SpaltenBreitenErmitteln()
    36. PrintDoc.Print()
    37. End SubPrivate Sub VorschauDruckenTabelleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VorschauDruckenTabelleToolStripMenuItem.Click
    38. '*** Druckvorschau
    39. PrintDoc.DefaultPageSettings.Landscape = Querformat
    40. SpaltenAutoSize = False
    41. SpaltenBreitenErmitteln()
    42. PrintPrev.Document = PrintDocPrintPrev.WindowState = FormWindowState.Maximized
    43. PrintPrev.ShowDialog()
    44. End SubSub SpaltenBreitenErmitteln()
    45. Dim ZellInhalt As StringDim Breite As Integer = 0Dim g As Graphics = DGV_Bleiebige_Tabellen.CreateGraphics
    46. SpaltenBreiten.Clear()
    47. DGVDruckbreite = 0
    48. If SpaltenAutoSize = True ThenFor DGVSpalte As Integer = 0 To DGV_Bleiebige_Tabellen.Columns.Count - 1
    49. ' *** Breite das Textes im Spaltenkopf als Mindestbreite
    50. ZellInhalt = DGV_Bleiebige_Tabellen.Columns(DGVSpalte).HeaderText
    51. Breite = g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width + ZellPadding
    52. SpaltenBreiten.Add(Breite)
    53. ' *** Jede Spalte komplett durchlaufen und größte Textbreite finden und speichern For DGVZeile As Integer = 0 To DGV_Bleiebige_Tabellen.Rows.Count - 2
    54. ' Zellinhalt holen und ggf. formatieren
    55. If DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value.ToString <> String.Empty Then
    56. ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value
    57. Else
    58. ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value.ToString
    59. End If
    60. ' Spaltenbreite feststellen und prüfen, ob größer als bisher und ggf. austauschen
    61. Breite = g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width + ZellPadding
    62. If SpaltenBreiten(DGVSpalte) < Breite Then
    63. SpaltenBreiten(DGVSpalte) = Breite
    64. End If
    65. DGVDruckbreite += Breite
    66. Next
    67. Next
    68. Else ' Kein SpaltenAutoSizingFor DGVSpalte As Integer = 0 To DGV_Bleiebige_Tabellen.Columns.Count - 1
    69. Breite = DGV_Bleiebige_Tabellen.Columns(DGVSpalte).Width + ZellPadding
    70. SpaltenBreiten.Add(Breite)
    71. DGVDruckbreite += Breite
    72. Next
    73. End If
    74. End Sub
    75. ' ********************************************************************************Sub PrintDoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
    76. Handles PrintDoc.PrintPage
    77. Dim ZellBox As New Rectangle
    78. Dim sf As New StringFormat
    79. Dim LRand As Decimal
    80. Dim RRand As Decimal
    81. Dim ROben As Decimal
    82. Dim RUnten As Decimal
    83. Dim PageWidth As Integer
    84. Dim PageHeight As Decimal
    85. Dim dgv_MaxZeilenIndex As Integer
    86. Dim dgv_MaxSpaltenIndex As IntegerDim dgv_Breite As Integer = 1
    87. Dim ZellInhalt As String
    88. Dim PosX As Integer
    89. Dim PosY As Integer
    90. Dim PosX1 As Integere.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    91. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
    92. ' *****
    93. ' * Höhe der Schrift ermitteln anhand der Schriftart(Font)
    94. ' * mittels Mustertext (mit Ober- und Unterlängen)
    95. ' * und Höhe geringfügig erhöhen
    96. ' ***** Dim g As Graphics = DGV_Bleiebige_Tabellen.CreateGraphics
    97. TextHöhe = g.MeasureString("Bg", DGV_Bleiebige_Tabellen.Font).Height + ZellPadding ' Mustertext zur Ermittlung der SchrifthöheWith PrintDoc.DefaultPageSettings
    98. LRand = .Margins.Left ' Rand links
    99. RRand = .Margins.Right ' Rand rechts
    100. ROben = .Margins.Top ' Rand oben
    101. RUnten = .Margins.Bottom ' Rand unten
    102. PageWidth = .Bounds.Width - (RRand + LRand) ' Druckbereich Breite
    103. PageHeight = .Bounds.Height - (ROben + RUnten) ' Druckbereich Höhe
    104. e.Graphics.DrawRectangle(Pens.Black, LRand, ROben, PageWidth, PageHeight) ' Rahmen um alles
    105. End With
    106.  
    107. PosY = ROben
    108. If HZentrieren = True Then ' Tabelle horizontal zentrieren
    109. LRand = (LRand + (PageWidth / 2)) - (DGVDruckbreite / 2)
    110. End If
    111. PosX = LRand
    112. ' * Den höchsten ZeilenIndex des DataGridview ermitteln
    113. ' * in Abhängigkeit davon, ob ein Zeile am Ende steht
    114. If DGV_Bleiebige_Tabellen.AllowUserToAddRows = True Then
    115. dgv_MaxZeilenIndex = DGV_Bleiebige_Tabellen.Rows.Count - 2
    116. Else
    117. dgv_MaxZeilenIndex = DGV_Bleiebige_Tabellen.Rows.Count - 1
    118. End If
    119. dgv_MaxSpaltenIndex = DGV_Bleiebige_Tabellen.Columns.Count - 1sf.Alignment = StringAlignment.Near
    120. sf.LineAlignment = StringAlignment.Center
    121. ' ***** Spaltenköpfe drucken
    122. DruckSpalte = 0
    123. DoZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    124. ZellInhalt = DGV_Bleiebige_Tabellen.Columns(DruckSpalte).HeaderTexte.Graphics.FillRectangle(New SolidBrush(HeaderColor), ZellBox)
    125. If DruckeGitternetzlinien = True Thene.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
    126. End Ife.Graphics.DrawString(ZellInhalt, DGV_Bleiebige_Tabellen.Font, Brushes.Black, ZellBox, sf)
    127. PosX += SpaltenBreiten(DruckSpalte)
    128. DruckSpalte += 1Loop Until DruckSpalte > dgv_MaxSpaltenIndex
    129. ' ***** Zeileninhalte drucken
    130. DruckZeile = 0
    131. PosX = LRand
    132. PosY = ROben + TextHöhe
    133. Dim Ausgabe = ""
    134. Do
    135. DruckSpalte = 0
    136. Do
    137. ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).Value.ToString
    138. 'ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).ValueZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    139. If DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Format.ToString <> String.Empty ThenZellInhalt = CDbl(ZellInhalt).ToString(DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Format.ToString)
    140. End If
    141. If (DGVZeilenIndex + DruckZeile) Mod 2 = 0 Then ' Zeilen abwechselnd einfärbene.Graphics.FillRectangle(New SolidBrush(RowColor), ZellBox)
    142. Elsee.Graphics.FillRectangle(New SolidBrush(RowColorAlternate), ZellBox)
    143. End If
    144. If DruckeGitternetzlinien = True Thene.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
    145. End IfSelect Case DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Alignment.ToString
    146. Case "NotSet", "MiddleLeft"ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    147. Case "MiddleRight"
    148. PosX1 = PosX + SpaltenBreiten(DruckSpalte) - (g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width)ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    149. Case "MiddleCenter"
    150. PosX1 = PosX + (SpaltenBreiten(DruckSpalte) / 2) - (g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width / 2)ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    151. Case ElseZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    152. End Selecte.Graphics.DrawString(ZellInhalt, DGV_Bleiebige_Tabellen.Font, Brushes.Black, ZellBox, sf)
    153. PosX += SpaltenBreiten(DruckSpalte)
    154. DruckSpalte += 1Loop Until (DruckSpalte > dgv_MaxSpaltenIndex)
    155. PosX = LRand
    156. PosY += TextHöhe
    157. DruckZeile += 1Loop Until ((DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex)) _
    158. OrElse ((PageHeight + ROben) < PosY + TextHöhe)
    159. If (DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex) Then
    160. e.HasMorePages = False
    161. DGVZeilenIndex = 0
    162. DruckSpalte = 0
    163. DruckZeile = 0
    164. Exit Sub
    165. Else
    166. e.HasMorePages = True
    167. DGVZeilenIndex = DruckZeile + DGVZeilenIndex
    168. Exit Sub
    169. End If
    170. End Sub
    171.  #End Region
    172. End Class
    Drucken von .Net aus ist ein ziemliches Gefriemel, und die Lösungen sind nicht sonderlich flexibel.
    Ich glaub für dich wärs einfacher, du exportierst deine Daten nach Excel, und dann kann der User von da ausdrucken.
    In Excel kann er jede Spaltenbreite einstellen, wie er will, und kann sogar Schriftgrößen anpassen, auch zeilenUmbruch in den Zellen etc. pp. - Features, die nachzuprogrammieren überaus aufwändig werden dürfte.