Datagridview drucken ohne tabellen rahmen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Bernd.

    Datagridview drucken ohne tabellen rahmen

    Hey liebe com,

    wie die überschrift schon sagt will ich mein datagridview drucken ( das funzt perfekt ).
    Nur was mich noch stört ist das man die tabelle sieht also damit meine ich die linien zwischen jeder spalte und zeile.
    Wie bekommt man das beim drucken weg?

    Lg erbse

    EDIT: Habs selber rausbekommen.

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

    Was heist ich habs hinbekommen.
    ich habe mir aus dem internet eine vorlage geholt zum drucken von dgv's
    mit seiten umbruch usw.



    Hier der code zum drucken der dgv's

    VB.NET-Quellcode

    1. ' ==================================================
    2. ' Projekt: DataGridView drucken
    3. '
    4. ' Autor: Peter Punkt
    5. '
    6. ' Version: 01 - 24.06.2009
    7. ' ==================================================
    8. Option Explicit On
    9. Option Strict Off
    10. Public Class Form1
    11. Private SpaltenBreiten As New List(Of Integer) ' Auflistung mit der Breite der einzelnen Spalten
    12. Private TextHöhe As Integer
    13. Private DruckSpalte As Integer
    14. Private DruckZeile As Integer
    15. Private DGVSpaltenIndex As Integer
    16. Private DGVZeilenIndex As Integer
    17. Private DGVDruckbreite As Integer
    18. Private ZellPadding As Integer = 5
    19. Private Querformat As Boolean = True
    20. Public HeaderColor As System.Drawing.Color = Color.LightGray
    21. Public RowColor As System.Drawing.Color = Color.White
    22. Public RowColorAlternate As System.Drawing.Color = Color.LightYellow
    23. Public HZentrieren As Boolean = True
    24. Public DruckeGitternetzlinien As Boolean = True
    25. Public SpaltenAutoSize As Boolean = False
    26. Private WithEvents PrintDoc As New System.Drawing.Printing.PrintDocument
    27. Private PrintPrev As New System.Windows.Forms.PrintPreviewDialog
    28. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    29. Handles MyBase.Load
    30. For I As Integer = 1 To 50
    31. dgv_Tabelle.Rows.Add("Peter", "Punkt-Maier", I)
    32. Next
    33. dgv_Tabelle.AllowUserToAddRows = False ' Für Testzwecke
    34. PrintDoc.DefaultPageSettings.Landscape = Querformat
    35. End Sub
    36. ' ********************************************************************************
    37. Private Sub btn_Drucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    38. Handles btn_Drucken.Click
    39. SpaltenBreitenErmitteln()
    40. PrintDoc.Print()
    41. End Sub
    42. ' ********************************************************************************
    43. Private Sub btn_Vorschau_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    44. Handles btn_Vorschau.Click
    45. SpaltenBreitenErmitteln()
    46. PrintPrev.Document = PrintDoc
    47. PrintPrev.WindowState = FormWindowState.Maximized
    48. PrintPrev.ShowDialog()
    49. End Sub
    50. ' ********************************************************************************
    51. Sub SpaltenBreitenErmitteln()
    52. Dim ZellInhalt As String
    53. Dim Breite As Integer = 0
    54. Dim g As Graphics = dgv_Tabelle.CreateGraphics
    55. SpaltenBreiten.Clear()
    56. DGVDruckbreite = 0
    57. If SpaltenAutoSize = True Then
    58. For DGVSpalte As Integer = 0 To dgv_Tabelle.Columns.Count - 1
    59. ' *** Breite das Textes im Spaltenkopf als Mindestbreite
    60. ZellInhalt = dgv_Tabelle.Columns(DGVSpalte).HeaderText
    61. Breite = g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width + ZellPadding
    62. SpaltenBreiten.Add(Breite)
    63. ' *** Jede Spalte komplett durchlaufen und größte Textbreite finden und speichern
    64. For DGVZeile As Integer = 0 To dgv_Tabelle.Rows.Count - 1
    65. ' Zellinhalt holen und ggf. formatieren
    66. ZellInhalt = dgv_Tabelle.Rows(DGVZeile).Cells(DGVSpalte).Value
    67. If dgv_Tabelle.Columns(DGVSpalte).DefaultCellStyle.Format.ToString <> String.Empty Then
    68. ZellInhalt = CDbl(ZellInhalt).ToString(dgv_Tabelle.Columns(DGVSpalte).DefaultCellStyle.Format.ToString)
    69. End If
    70. ' Spaltenbreite feststellen und prüfen, ob größer als bisher und ggf. austauschen
    71. Breite = g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width + ZellPadding
    72. If SpaltenBreiten(DGVSpalte) < Breite Then
    73. SpaltenBreiten(DGVSpalte) = Breite
    74. End If
    75. DGVDruckbreite += Breite
    76. Next
    77. Next
    78. Else ' Kein SpaltenAutoSizing
    79. For DGVSpalte As Integer = 0 To dgv_Tabelle.Columns.Count - 1
    80. Breite = dgv_Tabelle.Columns(DGVSpalte).Width + ZellPadding
    81. SpaltenBreiten.Add(Breite)
    82. DGVDruckbreite += Breite
    83. Next
    84. End If
    85. End Sub
    86. ' ********************************************************************************
    87. Sub PrintDoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
    88. Handles PrintDoc.PrintPage
    89. Dim ZellBox As New Rectangle
    90. Dim sf As New StringFormat
    91. Dim LRand As Decimal
    92. Dim RRand As Decimal
    93. Dim ROben As Decimal
    94. Dim RUnten As Decimal
    95. Dim PageWidth As Integer
    96. Dim PageHeight As Decimal
    97. Dim dgv_MaxZeilenIndex As Integer
    98. Dim dgv_MaxSpaltenIndex As Integer
    99. Dim dgv_Breite As Integer
    100. Dim ZellInhalt As String
    101. Dim PosX As Integer
    102. Dim PosY As Integer
    103. Dim PosX1 As Integer
    104. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
    105. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
    106. ' *****
    107. ' * Höhe der Schrift ermitteln anhand der Schriftart(Font)
    108. ' * mittels Mustertext (mit Ober- und Unterlängen)
    109. ' * und Höhe geringfügig erhöhen
    110. ' *****
    111. Dim g As Graphics = dgv_Tabelle.CreateGraphics
    112. TextHöhe = g.MeasureString("Bg", dgv_Tabelle.Font).Height + ZellPadding ' Mustertext zur Ermittlung der Schrifthöhe
    113. With PrintDoc.DefaultPageSettings
    114. LRand = .Margins.Left ' Rand links
    115. RRand = .Margins.Right ' Rand rechts
    116. ROben = .Margins.Top ' Rand oben
    117. RUnten = .Margins.Bottom ' Rand unten
    118. PageWidth = .Bounds.Width - (RRand + LRand) ' Druckbereich Breite
    119. PageHeight = .Bounds.Height - (ROben + RUnten) ' Druckbereich Höhe
    120. e.Graphics.DrawRectangle(Pens.Black, LRand, ROben, PageWidth, PageHeight) ' Rahmen um alles
    121. End With
    122. PosY = ROben
    123. If HZentrieren = True Then ' Tabelle horizontal zentrieren
    124. LRand = (LRand + (PageWidth / 2)) - (DGVDruckbreite / 2)
    125. End If
    126. PosX = LRand
    127. ' * Den höchsten ZeilenIndex des DataGridview ermitteln
    128. ' * in Abhängigkeit davon, ob ein Zeile am Ende steht
    129. If dgv_Tabelle.AllowUserToAddRows = True Then
    130. dgv_MaxZeilenIndex = dgv_Tabelle.Rows.Count - 2
    131. Else
    132. dgv_MaxZeilenIndex = dgv_Tabelle.Rows.Count - 1
    133. End If
    134. dgv_MaxSpaltenIndex = dgv_Tabelle.Columns.Count - 1
    135. sf.Alignment = StringAlignment.Near
    136. sf.LineAlignment = StringAlignment.Center
    137. ' ***** Spaltenköpfe drucken
    138. DruckSpalte = 0
    139. Do
    140. ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    141. ZellInhalt = dgv_Tabelle.Columns(DruckSpalte).HeaderText
    142. e.Graphics.FillRectangle(New SolidBrush(HeaderColor), ZellBox)
    143. If DruckeGitternetzlinien = True Then
    144. e.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
    145. End If
    146. e.Graphics.DrawString(ZellInhalt, dgv_Tabelle.Font, Brushes.Black, ZellBox, sf)
    147. PosX += SpaltenBreiten(DruckSpalte)
    148. DruckSpalte += 1
    149. Loop Until DruckSpalte > dgv_MaxSpaltenIndex
    150. ' ***** Zeileninhalte drucken
    151. DruckZeile = 0
    152. PosX = LRand
    153. PosY = ROben + TextHöhe
    154. Do
    155. DruckSpalte = 0
    156. Do
    157. ZellInhalt = dgv_Tabelle.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).Value
    158. ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    159. If dgv_Tabelle.Columns(DruckSpalte).DefaultCellStyle.Format.ToString <> String.Empty Then
    160. ZellInhalt = CDbl(ZellInhalt).ToString(dgv_Tabelle.Columns(DruckSpalte).DefaultCellStyle.Format.ToString)
    161. End If
    162. If (DGVZeilenIndex + DruckZeile) Mod 2 = 0 Then ' Zeilen abwechselnd einfärben
    163. e.Graphics.FillRectangle(New SolidBrush(RowColor), ZellBox)
    164. Else
    165. e.Graphics.FillRectangle(New SolidBrush(RowColorAlternate), ZellBox)
    166. End If
    167. If DruckeGitternetzlinien = True Then
    168. e.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
    169. End If
    170. Select Case dgv_Tabelle.Columns(DruckSpalte).DefaultCellStyle.Alignment.ToString
    171. Case "NotSet", "MiddleLeft"
    172. ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    173. Case "MiddleRight"
    174. PosX1 = PosX + SpaltenBreiten(DruckSpalte) - (g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width)
    175. ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    176. Case "MiddleCenter"
    177. PosX1 = PosX + (SpaltenBreiten(DruckSpalte) / 2) - (g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width / 2)
    178. ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    179. Case Else
    180. ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
    181. End Select
    182. e.Graphics.DrawString(ZellInhalt, dgv_Tabelle.Font, Brushes.Black, ZellBox, sf)
    183. PosX += SpaltenBreiten(DruckSpalte)
    184. DruckSpalte += 1
    185. Loop Until (DruckSpalte > dgv_MaxSpaltenIndex)
    186. PosX = LRand
    187. PosY += TextHöhe
    188. DruckZeile += 1
    189. Loop Until ((DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex)) _
    190. OrElse ((PageHeight + ROben) < PosY + TextHöhe)
    191. If (DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex) Then
    192. e.HasMorePages = False
    193. DGVZeilenIndex = 0
    194. DruckSpalte = 0
    195. DruckZeile = 0
    196. Exit Sub
    197. Else
    198. e.HasMorePages = True
    199. DGVZeilenIndex = DruckZeile + DGVZeilenIndex
    200. Exit Sub
    201. End If
    202. End Sub
    203. End Class


    und bei dem code einfach diese zeile hier


    VB.NET-Quellcode

    1. Public DruckeGitternetzlinien As Boolean = True

    auf false setzen und fertig

    lg


    EDIT:

    Ich habe aber noch folgendes problem also mein programm ist nun soweit das es folgendes drucken kann




    da mein code zum drucken ja automatisch einen seiten umbruch meines dgv's macht wenn mehrere einträge sind
    wird eine 2. seite angelegt.

    so wie es ja sein soll, nur mein problem ist das auf der seite 2 dann auch wieder anschrift usw dasteht.

    wie hier zu sehen ist.



    Wie kann ich es machen das das firmen logo, die anschrift usw nur auf seite 1 ist und alle anderen seiten nur das dgv zu sehen ist.
    Also soll praktisch ab seite 2 nur noch das dgv stehen mehr nicht.

    Kann mir jemand helfen?

    Lg

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

    Meinen Briefkopf zeichne ich wie folgt:

    VB.NET-Quellcode

    1. Dim logo As Size = New Size(80, 20)
    2. Dim gr As Graphics = e.Graphics
    3. Dim printrect As Rectangle = e.MarginBounds
    4. Dim oImage As Image = PictureBox1.Image
    5. gr.DrawImage(oImage, logo) ' Firmen logo drucken
    6. gr.DrawString("Koch & Wagner GbR Zimmerei & Holzbau Schulplatz 4 99869 Friemar", New Font("Arial", _
    7. 9, FontStyle.Regular), Brushes.Black, 80, 210)
    8. gr.DrawString(Label2.Text, New Font("Arial", _
    9. 11, FontStyle.Regular), Brushes.Black, 80, 240)
    10. gr.DrawString(Label3.Text, New Font("Arial", _
    11. 11, FontStyle.Regular), Brushes.Black, 80, 260)
    12. gr.DrawString(Label4.Text, New Font("Arial", _
    13. 11, FontStyle.Regular), Brushes.Black, 140, 260)
    14. gr.DrawString(Label5.Text, New Font("Arial", _
    15. 11, FontStyle.Regular), Brushes.Black, 80, 280)
    16. gr.DrawString(Label6.Text, New Font("Arial", _
    17. 11, FontStyle.Regular), Brushes.Black, 80, 320)
    18. gr.DrawString(Label7.Text, New Font("Arial", _
    19. 11, FontStyle.Regular), Brushes.Black, 140, 320)
    20. gr.DrawString(Label8.Text, New Font("Arial", _
    21. 11, FontStyle.Regular), Brushes.Black, 650, 240)
    22. gr.DrawString("Rechnung", New Font("Arial", _
    23. 16, FontStyle.Regular), Brushes.Red, 80, 420)


    da ich noch alles teste steht über all noch label :D wird noch geändert
    aber die labels sind die anschrift usw

    Wie mache ich diese abfrage? mit IF?
    Vllt ein beispiel?

    Thx
    lg erbse

    erbse schrieb:

    Wie kann ich es machen das das firmen logo, die anschrift usw nur auf seite 1 ist und alle anderen seiten nur das dgv zu sehen ist.

    (du lieber himmel!)
    drucke firmen logo, die anschrift usw halt nur auf seite 1 . Gibts da keinen Zähler oder sowas, beim PrintPage?
    Zähler nicht aber

    VB.NET-Quellcode

    1. Public _Mehr_Seiten As Boolean = False
    2. Private Sub Listen_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Listen.PrintPage
    3. If e.HasMorePages = True Then
    4. MessageBox.Show("Ja mehr als eine Seite")
    5. _Mehr_Seiten = True
    6. End If
    7. If _Mehr_Seiten = False Then
    8. ' Hier Zeichnen
    9. End If


    Bastel dir eine Variable und frag ab ob es mehr als eine Seite gibt.
    Du solltest Dich mit den Eigenschaften von PrintPreviewDialog beschäftigen.
    Außerdem sieht Option Strict Off in Deinem Quellcode außerordentlich schlecht aus.
    Das kommt davon, wenn man Code aus dem Net kopiert und zu benutzen versucht, aber ihn nicht versteht.
    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!
    Wenn du mehrere Seiten Drucken willst gibt es auch noch weitere möglichkeiten

    VB.NET-Quellcode

    1. Public _Mehr_Seiten As Boolean = False
    2. Private Sub Listen_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Listen.PrintPage
    3. If e.HasMorePages = True Then
    4. MessageBox.Show("Ja mehr als eine Seite")
    5. _Mehr_Seiten = True
    6. End If
    7. If _Mehr_Seiten = False Then
    8. ' Hier Zeichnen
    9. else
    10. ' Weitere Aktionen durchführen wenn die Letzte seite erreicht ist.
    11. End If
    hm else hab ich jetz schon verbaut und zwar is das bei mir so

    also _mehr_seiten ist auf false das is klar

    dann wo bei dir steht ' Hier zeichnen
    da wird mein briefkopf gezeichnet und der druckbereich vom dgv eingestellt

    und wo bei dir steht ' Weitere Aktionen durchführen wenn die Letzte seite erreicht ist.
    werden bei mir alle anderen seiten gezeichnet und zwar ohne briefkopf und der druckbereich vom dgv geändert damit er oben anfängt das dgv zu zeichnen.

    Nur wie mach ich das das er ein 2. dgv druckt hinter das 1. bzw am ersten dran hängt?

    lg erbse
    Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

    VB.NET-Quellcode

    1. Public _Mehr_Seiten As Boolean = False
    2. Private Sub Listen_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Listen.PrintPage
    3. If e.HasMorePages = True Then
    4. MessageBox.Show("Ja mehr als eine Seite")
    5. _Mehr_Seiten = True
    6. End If
    7. If _Mehr_Seiten = False Then
    8. ' Hier Zeichnen
    9. else
    10. ' Weitere Aktionen durchführen wenn die Letzte seite erreicht ist.
    11. End If
    12. ' Nun mache mal weiter mit dem Drucken, men aber ein anderes Formular.
    13. End Sub