Hallo versuche gerade aus einem Datagriedview den angezeigten Inhalt zu drucken.
Als eingesetzte Klasse kommt der Code von Klaus D. Raudszus zum Einsatz der soweit auch alles aus der Tabelle druckt, leider aber auch wirklich alles.
Die ausgeblendeten Spalten im Datadriedview sollen aber nicht mit gedruckt werden da ich diese nur als Filter brauche.
Als Datenquelle dient eine Access Datenbank.
Nachfolgend mal der verwendetet Code
Als eingesetzte Klasse kommt der Code von Klaus D. Raudszus zum Einsatz der soweit auch alles aus der Tabelle druckt, leider aber auch wirklich alles.
Die ausgeblendeten Spalten im Datadriedview sollen aber nicht mit gedruckt werden da ich diese nur als Filter brauche.
Als Datenquelle dient eine Access Datenbank.
Nachfolgend mal der verwendetet Code
Code:
Option Strict On
''' <summary>
''' Author: Klaus D. Raudszus / VB 2005, Visual Studio Prof./ November 2006
''' </summary>
''' <remarks></remarks>
Public Class DGVPrint
Protected m_Pages As Int32
Protected m_intTotalWidth As Int32
Protected m_intPageHeight As Int32
Protected m_intRowsToPrint As Int32
Protected m_arColsWidth() As Int32
Protected m_arHeaderText() As System.String
Protected m_ftHeaderFont As Font
Protected m_DataGridView As DataGridView
Protected WithEvents m_PrintDoc As Printing.PrintDocument
Public Sub New()
Me.m_Pages = 0
Me.m_intTotalWidth = 0
Me.m_intPageHeight = 0
Me.m_intRowsToPrint = 0
Me.m_ftHeaderFont = New Font("Arial", 9.75!)
End Sub
Public Sub New(ByVal dgv As DataGridView)
Me.New()
Me.m_DataGridView = dgv
ReDim Me.m_arColsWidth(Me.m_DataGridView.ColumnCount - 1)
ReDim Me.m_arHeaderText(Me.m_DataGridView.ColumnCount - 1)
End Sub
''' <summary>
''' Ermittelt die Orientierung der Seite und erstellt Druckvorschau
''' </summary>
''' <remarks></remarks>
Public Overridable Sub Print()
Me.m_PrintDoc = New Printing.PrintDocument
AddHandler m_PrintDoc.EndPrint, AddressOf Me.EndPrint
Dim intCols As Int32 = Me.m_DataGridView.ColumnCount - 1
For i As Int32 = 0 To intCols
Me.m_arColsWidth(i) = Me.GetColumnsSize(i)
Me.m_arHeaderText(i) = Me.GetHeaderText(i)
Me.m_intTotalWidth = Me.m_intTotalWidth + Me.m_arColsWidth(i)
Next
If Me.m_intTotalWidth > Me.m_PrintDoc.DefaultPageSettings.PaperSize.Width Then
Me.m_PrintDoc.DefaultPageSettings.Landscape = True
Me.m_PrintDoc.DefaultPageSettings.Margins.Top = 35
Me.m_intPageHeight = Me.m_PrintDoc.DefaultPageSettings.PaperSize.Width
Else
Me.m_intPageHeight = Me.m_PrintDoc.DefaultPageSettings.PaperSize.Height
End If
Dim ppd As PrintPreviewDialog = New PrintPreviewDialog()
ppd.Document = Me.m_PrintDoc
ppd.ShowDialog()
End Sub
Protected Overridable Sub m_PrintDoc_PrintPage(ByVal sender As System.Object, _
ByVal e As Printing.PrintPageEventArgs) Handles m_PrintDoc.PrintPage
Me.PrintHeader(e.Graphics)
Me.PrintRows(e)
'Seitenzahl unten links drucken
Dim str As String = "Seite " & Me.m_Pages.ToString
e.Graphics.DrawString(str, _
Me.m_DataGridView.Font, Brushes.Blue, _
Me.m_PrintDoc.DefaultPageSettings.Margins.Left, Me.m_intPageHeight - 75)
End Sub
''' <summary>
''' Methode druckt die Spaltenüberschriften des DGV als Kopfzeile
''' </summary>
''' <param name="g"></param>
''' <remarks></remarks>
Protected Overridable Sub PrintHeader(ByVal g As Graphics)
Dim x As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
Dim y As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Top
For i As Int32 = 0 To Me.m_arHeaderText.Length - 1
g.DrawString(Me.m_arHeaderText(i), Me.m_ftHeaderFont, Brushes.Blue, x, y)
x += Me.m_arColsWidth(i)
Next
End Sub
''' <summary>
''' Methode druckt die Reihen und fordert bei Bedarf neue Seite an
''' </summary>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Overridable Sub PrintRows(ByVal e As Printing.PrintPageEventArgs)
Dim intCols As Int32 = Me.m_DataGridView.ColumnCount - 1
Dim intRows As Int32 = Me.m_DataGridView.RowCount - 2
Dim x As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
Dim y As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Top + 50
Me.m_Pages += 1
For i As Int32 = Me.m_intRowsToPrint To intRows
For ii As Int32 = 0 To intCols
Dim str As System.String = Me.m_DataGridView.Rows(i).Cells(ii).Value.ToString
e.Graphics.DrawString(str, Me.m_DataGridView.Font, Brushes.Black, x, y)
x += Me.m_arColsWidth(ii)
Next
x = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
y += 30
If y > (Me.m_intPageHeight - _
Me.m_PrintDoc.DefaultPageSettings.Margins.Bottom) Then
e.HasMorePages = True
Me.m_intRowsToPrint = i + 1
Return
Else
e.HasMorePages = False
Me.m_intRowsToPrint = 0
End If
Next
End Sub
''' <summary>
''' Funktion zum Ermitteln der einzelnen Spaltenüberschrift
''' </summary>
''' <param name="col">
''' Übergabe der Spaltennummer
''' </param>
''' <returns>
''' Gibt die Spaltenüberschrift zurück
''' </returns>
''' <remarks></remarks>
Protected Overridable Function GetHeaderText(ByVal col As Int32) As System.String
Return Me.m_DataGridView.Columns(col).HeaderText
End Function
''' <summary>
''' Funktion zum Ermitteln der einzelnen Spaltenbreite
''' </summary>
''' <param name="col">
''' Übergabe der Spaltennummer
''' </param>
''' <returns>
''' Gibt die Spaltebreite der ausgewählten Spalte zurück
''' </returns>
''' <remarks></remarks>
Protected Overridable Function GetColumnsSize(ByVal col As Int32) As Int32
Dim sglWidth As System.Single = 0
Dim intRows As Int32 = Me.m_DataGridView.RowCount - 2
Using g As Graphics = Graphics.FromHwnd(Me.m_DataGridView.Handle)
Dim newSizeF As SizeF = g.MeasureString(Me.GetHeaderText(col), Me.m_ftHeaderFont)
sglWidth = newSizeF.Width + 15
For i As Int32 = 0 To intRows
newSizeF = g.MeasureString( _
Me.m_DataGridView.Rows(i).Cells(col).Value.ToString, _
Me.m_DataGridView.Font)
If newSizeF.Width > sglWidth Then sglWidth = newSizeF.Width + 15
Next
End Using
Return Convert.ToInt32(sglWidth)
End Function
Protected Overridable Sub EndPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs)
Me.m_Pages = 0
End Sub
End Class