VB2010express Datagriedview drucken

werner_sg

Erfahrenes Mitglied
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

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
 
Wenn ich das richtige sehe durch läufst du in der printRows methode die Spalten mittels einer For Schleife zum zeichnen der Zelleninhalte.
Öhm schließ dort einfach die nicht sichtbaren Spalten aus.
 
Hallo Spyke,

kannst Du mir das etwas näher erklären oder ein Beispiel geben?

Ich betreibe hier gerade learning by doing :D immer so wie ich gerade Zeit habe.

Danke
 

Neue Beiträge

Zurück