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
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
- Imports System.Data.OleDb
- Imports System.Data
- Imports System.Data.Common
- Imports System.Data.Odbc
- Imports System.Data.Sql
- Imports System.Data.SqlTypes
- Imports System.Data.SqlClient
- Imports System
- Imports Microsoft.VisualBasic
- Public Class F_Datenblatt_beliebiger_Filter
- #Region "Drucken"
- Private SpaltenBreiten As New List(Of Integer) ' Auflistung mit der Breite der einzelnen Spalten
- Private TextHöhe As Integer
- Private DruckSpalte As Integer
- Private DruckZeile As Integer
- Private DGVSpaltenIndex As Integer
- Private DGVZeilenIndex As Integer
- Private DGVDruckbreite As IntegerPrivate ZellPadding As Integer = 5
- Private Querformat As Boolean = TruePublic HeaderColor As System.Drawing.Color = Color.LightGray
- Public RowColor As System.Drawing.Color = Color.WhitePublic RowColorAlternate As System.Drawing.Color = Color.LightYellow
- Public HZentrieren As Boolean = True
- Public DruckeGitternetzlinien As Boolean = True
- Public SpaltenAutoSize As Boolean = False
- Private WithEvents PrintDoc As New System.Drawing.Printing.PrintDocument
- Private PrintPrev As New System.Windows.Forms.PrintPreviewDialogPrivate Sub DruckenTabelleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DruckenTabelleToolStripMenuItem.Click
- '*******************************************************************************************************
- '*** ***
- '*** Druckausgabe für eine beliebige Auswertung ***
- '*** ***
- '*** für F_Datenblatt_beliebiger_Filter.vb ***
- '*** ***
- '*******************************************************************************************************
- PrintDoc.DefaultPageSettings.Landscape = Querformat
- SpaltenAutoSize = False
- SpaltenBreitenErmitteln()
- PrintDoc.Print()
- End SubPrivate Sub VorschauDruckenTabelleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VorschauDruckenTabelleToolStripMenuItem.Click
- '*** Druckvorschau
- PrintDoc.DefaultPageSettings.Landscape = Querformat
- SpaltenAutoSize = False
- SpaltenBreitenErmitteln()
- PrintPrev.Document = PrintDocPrintPrev.WindowState = FormWindowState.Maximized
- PrintPrev.ShowDialog()
- End SubSub SpaltenBreitenErmitteln()
- Dim ZellInhalt As StringDim Breite As Integer = 0Dim g As Graphics = DGV_Bleiebige_Tabellen.CreateGraphics
- SpaltenBreiten.Clear()
- DGVDruckbreite = 0
- If SpaltenAutoSize = True ThenFor DGVSpalte As Integer = 0 To DGV_Bleiebige_Tabellen.Columns.Count - 1
- ' *** Breite das Textes im Spaltenkopf als Mindestbreite
- ZellInhalt = DGV_Bleiebige_Tabellen.Columns(DGVSpalte).HeaderText
- Breite = g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width + ZellPadding
- SpaltenBreiten.Add(Breite)
- ' *** Jede Spalte komplett durchlaufen und größte Textbreite finden und speichern For DGVZeile As Integer = 0 To DGV_Bleiebige_Tabellen.Rows.Count - 2
- ' Zellinhalt holen und ggf. formatieren
- If DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value.ToString <> String.Empty Then
- ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value
- Else
- ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DGVZeile).Cells(DGVSpalte).Value.ToString
- End If
- ' Spaltenbreite feststellen und prüfen, ob größer als bisher und ggf. austauschen
- Breite = g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width + ZellPadding
- If SpaltenBreiten(DGVSpalte) < Breite Then
- SpaltenBreiten(DGVSpalte) = Breite
- End If
- DGVDruckbreite += Breite
- Next
- Next
- Else ' Kein SpaltenAutoSizingFor DGVSpalte As Integer = 0 To DGV_Bleiebige_Tabellen.Columns.Count - 1
- Breite = DGV_Bleiebige_Tabellen.Columns(DGVSpalte).Width + ZellPadding
- SpaltenBreiten.Add(Breite)
- DGVDruckbreite += Breite
- Next
- End If
- End Sub
- ' ********************************************************************************Sub PrintDoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
- Handles PrintDoc.PrintPage
- Dim ZellBox As New Rectangle
- Dim sf As New StringFormat
- Dim LRand As Decimal
- Dim RRand As Decimal
- Dim ROben As Decimal
- Dim RUnten As Decimal
- Dim PageWidth As Integer
- Dim PageHeight As Decimal
- Dim dgv_MaxZeilenIndex As Integer
- Dim dgv_MaxSpaltenIndex As IntegerDim dgv_Breite As Integer = 1
- Dim ZellInhalt As String
- Dim PosX As Integer
- Dim PosY As Integer
- Dim PosX1 As Integere.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
- e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
- ' *****
- ' * Höhe der Schrift ermitteln anhand der Schriftart(Font)
- ' * mittels Mustertext (mit Ober- und Unterlängen)
- ' * und Höhe geringfügig erhöhen
- ' ***** Dim g As Graphics = DGV_Bleiebige_Tabellen.CreateGraphics
- TextHöhe = g.MeasureString("Bg", DGV_Bleiebige_Tabellen.Font).Height + ZellPadding ' Mustertext zur Ermittlung der SchrifthöheWith PrintDoc.DefaultPageSettings
- LRand = .Margins.Left ' Rand links
- RRand = .Margins.Right ' Rand rechts
- ROben = .Margins.Top ' Rand oben
- RUnten = .Margins.Bottom ' Rand unten
- PageWidth = .Bounds.Width - (RRand + LRand) ' Druckbereich Breite
- PageHeight = .Bounds.Height - (ROben + RUnten) ' Druckbereich Höhe
- e.Graphics.DrawRectangle(Pens.Black, LRand, ROben, PageWidth, PageHeight) ' Rahmen um alles
- End With
- PosY = ROben
- If HZentrieren = True Then ' Tabelle horizontal zentrieren
- LRand = (LRand + (PageWidth / 2)) - (DGVDruckbreite / 2)
- End If
- PosX = LRand
- ' * Den höchsten ZeilenIndex des DataGridview ermitteln
- ' * in Abhängigkeit davon, ob ein Zeile am Ende steht
- If DGV_Bleiebige_Tabellen.AllowUserToAddRows = True Then
- dgv_MaxZeilenIndex = DGV_Bleiebige_Tabellen.Rows.Count - 2
- Else
- dgv_MaxZeilenIndex = DGV_Bleiebige_Tabellen.Rows.Count - 1
- End If
- dgv_MaxSpaltenIndex = DGV_Bleiebige_Tabellen.Columns.Count - 1sf.Alignment = StringAlignment.Near
- sf.LineAlignment = StringAlignment.Center
- ' ***** Spaltenköpfe drucken
- DruckSpalte = 0
- DoZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- ZellInhalt = DGV_Bleiebige_Tabellen.Columns(DruckSpalte).HeaderTexte.Graphics.FillRectangle(New SolidBrush(HeaderColor), ZellBox)
- If DruckeGitternetzlinien = True Thene.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
- End Ife.Graphics.DrawString(ZellInhalt, DGV_Bleiebige_Tabellen.Font, Brushes.Black, ZellBox, sf)
- PosX += SpaltenBreiten(DruckSpalte)
- DruckSpalte += 1Loop Until DruckSpalte > dgv_MaxSpaltenIndex
- ' ***** Zeileninhalte drucken
- DruckZeile = 0
- PosX = LRand
- PosY = ROben + TextHöhe
- Dim Ausgabe = ""
- Do
- DruckSpalte = 0
- Do
- ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).Value.ToString
- 'ZellInhalt = DGV_Bleiebige_Tabellen.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).ValueZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- If DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Format.ToString <> String.Empty ThenZellInhalt = CDbl(ZellInhalt).ToString(DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Format.ToString)
- End If
- If (DGVZeilenIndex + DruckZeile) Mod 2 = 0 Then ' Zeilen abwechselnd einfärbene.Graphics.FillRectangle(New SolidBrush(RowColor), ZellBox)
- Elsee.Graphics.FillRectangle(New SolidBrush(RowColorAlternate), ZellBox)
- End If
- If DruckeGitternetzlinien = True Thene.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
- End IfSelect Case DGV_Bleiebige_Tabellen.Columns(DruckSpalte).DefaultCellStyle.Alignment.ToString
- Case "NotSet", "MiddleLeft"ZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- Case "MiddleRight"
- PosX1 = PosX + SpaltenBreiten(DruckSpalte) - (g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width)ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- Case "MiddleCenter"
- PosX1 = PosX + (SpaltenBreiten(DruckSpalte) / 2) - (g.MeasureString(ZellInhalt, DGV_Bleiebige_Tabellen.Font).Width / 2)ZellBox = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- Case ElseZellBox = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
- End Selecte.Graphics.DrawString(ZellInhalt, DGV_Bleiebige_Tabellen.Font, Brushes.Black, ZellBox, sf)
- PosX += SpaltenBreiten(DruckSpalte)
- DruckSpalte += 1Loop Until (DruckSpalte > dgv_MaxSpaltenIndex)
- PosX = LRand
- PosY += TextHöhe
- DruckZeile += 1Loop Until ((DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex)) _
- OrElse ((PageHeight + ROben) < PosY + TextHöhe)
- If (DruckZeile + DGVZeilenIndex) > (dgv_MaxZeilenIndex) Then
- e.HasMorePages = False
- DGVZeilenIndex = 0
- DruckSpalte = 0
- DruckZeile = 0
- Exit Sub
- Else
- e.HasMorePages = True
- DGVZeilenIndex = DruckZeile + DGVZeilenIndex
- Exit Sub
- End If
- End Sub
- #End Region
- End Class