in

VB 2008: Aus DataGridView drucken?

Letzter Beitrag 12-08-2011 10:09 von BeKos. 10 Antworten.
Seite 1 von 1 (11 Treffer)
Beiträge sortieren: Zurück Weiter
  • 10-23-2009 16:07

    • vbfreak
    • Top 25 Mitwirkender
    • Registriert am 09-12-2007
    • Windows 7 Ult. + VS08 TS&Pro, VS10 Ult.
    • Beiträge 250

    VB 2008: Aus DataGridView drucken?

    Hallo, ich habe mir ein kleines Programm zum verwalten meines SQL-Servers geschrieben, scheitere aber am Drucken. Ich möchte lediglich die sich auf der Form befindene
    DataGridView ausdrucken. Leider habe ich derzeit noch keine großen Erfahrungen mit dem Drucken in VB.

    Könnte mir vielleicht jemand sagen, wie ich das bewerkstellige?

     

    Mit freundlichen Grüßen
    vbfreak

    • IP-Adresse ist Registriert
  • 10-23-2009 17:41 Antwort zu

    • Peter_Punkt
    • Top 10 Mitwirkender
    • Registriert am 03-28-2007
    • VS Community 2015, VB, C#, Office 2010, Win 10
    • Beiträge 2.605

    AW: VB 2008: Aus DataGridView drucken?

    So geht's:

    Das Drucken eines DataGridView ist praktisch des Zeichnen der einzelnen Zellen mit den Graphics-Objekten. Man muß u.a. Spaltenbreiten ermitteln, Schriftgröße errechnen lassen, den Seitenumbruch berücksichtigen und die Events beim Druckvorang kennen.

    Das nachfolgende Code-Beispiel zeigt die Vorgehensweise.

    Code-Beispiel:

    ' ==================================================
    '
    Projekt:  DataGridView drucken
    '
    '
    Autor:    Peter Punkt
    '
    '
    Version:  01 - 24.06.2009
    '
    ==================================================

    Option Explicit On
    Option Strict Off

    Public Class Form1

       
    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 Integer
       
    Private ZellPadding As Integer = 5
       
    Private Querformat As Boolean = True

       
    Public HeaderColor As System.Drawing.Color = Color.LightGray
       
    Public RowColor As System.Drawing.Color = Color.White
       
    Public 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.PrintPreviewDialog

       
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                              
    Handles MyBase.Load

           
    For I As Integer = 1 To 50
                dgv_Tabelle.Rows.Add(
    "Peter", "Punkt-Maier", I)
           
    Next

            dgv_Tabelle.AllowUserToAddRows
    = False          ' Für Testzwecke

            PrintDoc.DefaultPageSettings.Landscape
    = Querformat

       
    End Sub

       
    ' ********************************************************************************

       
    Private Sub btn_Drucken_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                     
    Handles btn_Drucken.Click

            SpaltenBreitenErmitteln()
            PrintDoc.Print()

       
    End Sub

       
    ' ********************************************************************************

       
    Private Sub btn_Vorschau_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                      
    Handles btn_Vorschau.Click

            SpaltenBreitenErmitteln()

            PrintPrev.Document
    = PrintDoc
            PrintPrev.WindowState
    = FormWindowState.Maximized
            PrintPrev.ShowDialog()

       
    End Sub

       
    ' ********************************************************************************

       
    Sub SpaltenBreitenErmitteln()

           
    Dim ZellInhalt As String
           
    Dim Breite As Integer = 0
           
    Dim g As Graphics = dgv_Tabelle.CreateGraphics

            SpaltenBreiten.Clear()
            DGVDruckbreite
    = 0

           
    If SpaltenAutoSize = True Then
               
    For DGVSpalte As Integer = 0 To dgv_Tabelle.Columns.Count - 1

                   
    ' *** Breite das Textes im Spaltenkopf als Mindestbreite
                    ZellInhalt = dgv_Tabelle.Columns(DGVSpalte).HeaderText
                    Breite
    = g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width + ZellPadding
                    SpaltenBreiten.Add(Breite)

                   
    ' *** Jede Spalte komplett durchlaufen und größte Textbreite finden und speichern
                    For DGVZeile As Integer = 0 To dgv_Tabelle.Rows.Count - 1
                       
    ' Zellinhalt holen und ggf. formatieren
                        ZellInhalt = dgv_Tabelle.Rows(DGVZeile).Cells(DGVSpalte).Value
                       
    If dgv_Tabelle.Columns(DGVSpalte).DefaultCellStyle.Format.ToString <> String.Empty Then
                            ZellInhalt
    = CDbl(ZellInhalt).ToString(dgv_Tabelle.Columns(DGVSpalte).DefaultCellStyle.Format.ToString)
                       
    End If
                       
    ' Spaltenbreite feststellen und prüfen, ob größer als bisher und ggf. austauschen
                        Breite = g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width + ZellPadding
                       
    If SpaltenBreiten(DGVSpalte) < Breite Then
                            SpaltenBreiten(DGVSpalte)
    = Breite
                       
    End If
                        DGVDruckbreite
    += Breite
                   
    Next

               
    Next
           
    Else                                                            ' Kein SpaltenAutoSizing
                For DGVSpalte As Integer = 0 To dgv_Tabelle.Columns.Count - 1
                    Breite
    = dgv_Tabelle.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 Integer
           
    Dim dgv_Breite As Integer

           
    Dim ZellInhalt As String
           
    Dim PosX As Integer
           
    Dim PosY As Integer
           
    Dim PosX1 As Integer

            e.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_Tabelle.CreateGraphics
            TextHöhe
    = g.MeasureString("Bg", dgv_Tabelle.Font).Height + ZellPadding ' Mustertext zur Ermittlung der Schrifthöhe

           
    With 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_Tabelle.AllowUserToAddRows = True Then
                dgv_MaxZeilenIndex
    = dgv_Tabelle.Rows.Count - 2
           
    Else
                dgv_MaxZeilenIndex
    = dgv_Tabelle.Rows.Count - 1
           
    End If

            dgv_MaxSpaltenIndex
    = dgv_Tabelle.Columns.Count - 1

            sf.Alignment
    = StringAlignment.Near
            sf.LineAlignment
    = StringAlignment.Center

           
    ' ***** Spaltenköpfe drucken
            DruckSpalte = 0
           
    Do
                ZellBox
    = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)
                ZellInhalt
    = dgv_Tabelle.Columns(DruckSpalte).HeaderText

                e.Graphics.FillRectangle(
    New SolidBrush(HeaderColor), ZellBox)
               
    If DruckeGitternetzlinien = True Then
                    e.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
               
    End If
                e.Graphics.DrawString(ZellInhalt, dgv_Tabelle.Font, Brushes.Black, ZellBox, sf)

                PosX
    += SpaltenBreiten(DruckSpalte)
                DruckSpalte
    += 1
           
    Loop Until DruckSpalte > dgv_MaxSpaltenIndex

           
    ' ***** Zeileninhalte drucken

            DruckZeile
    = 0
            PosX
    = LRand
            PosY
    = ROben + TextHöhe

           
    Do
                DruckSpalte
    = 0
               
    Do
                    ZellInhalt
    = dgv_Tabelle.Rows(DruckZeile + DGVZeilenIndex).Cells(DruckSpalte).Value
                    ZellBox
    = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)

                   
    If dgv_Tabelle.Columns(DruckSpalte).DefaultCellStyle.Format.ToString <> String.Empty Then
                        ZellInhalt
    = CDbl(ZellInhalt).ToString(dgv_Tabelle.Columns(DruckSpalte).DefaultCellStyle.Format.ToString)
                   
    End If

                   
    If (DGVZeilenIndex + DruckZeile) Mod 2 = 0 Then ' Zeilen abwechselnd einfärben
                        e.Graphics.FillRectangle(New SolidBrush(RowColor), ZellBox)
                   
    Else
                        e.Graphics.FillRectangle(
    New SolidBrush(RowColorAlternate), ZellBox)
                   
    End If

                   
    If DruckeGitternetzlinien = True Then
                        e.Graphics.DrawRectangle(Pens.Black, ZellBox.X, ZellBox.Y, ZellBox.Width, ZellBox.Height)
                   
    End If

                   
    Select Case dgv_Tabelle.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_Tabelle.Font).Width)
                            ZellBox
    = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)

                       
    Case "MiddleCenter"
                            PosX1 = PosX + (SpaltenBreiten(DruckSpalte) / 2) - (g.MeasureString(ZellInhalt, dgv_Tabelle.Font).Width / 2)
                            ZellBox
    = New Rectangle(PosX1, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)

                       
    Case Else
                            ZellBox
    = New Rectangle(PosX, PosY, SpaltenBreiten(DruckSpalte), TextHöhe)

                   
    End Select
                    e.Graphics.DrawString(ZellInhalt, dgv_Tabelle.Font, Brushes.Black, ZellBox, sf)

                    PosX
    += SpaltenBreiten(DruckSpalte)
                    DruckSpalte
    += 1

               
    Loop Until (DruckSpalte > dgv_MaxSpaltenIndex)

                PosX
    = LRand
                PosY
    += TextHöhe
                DruckZeile
    += 1
           
    Loop 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 Class

    Zwar weiß ich viel, doch möcht' ich alles wissen.
    Dass ich erkenne, was die Welt im Innersten zusammenhält
    • IP-Adresse ist Registriert
  • 10-23-2009 23:20 Antwort zu

    • vbfreak
    • Top 25 Mitwirkender
    • Registriert am 09-12-2007
    • Windows 7 Ult. + VS08 TS&Pro, VS10 Ult.
    • Beiträge 250

    AW: VB 2008: Aus DataGridView drucken?

     Hallo, Peter!

     

    Vielen Dank für deine Hilfe! Das hat mir geholfen.

     

    MfG
    vbfreak

    • IP-Adresse ist Registriert
  • 02-25-2010 16:21 Antwort zu

    • arnoau
    • Nicht gereiht
    • Registriert am 02-25-2010
    • Beiträge 4

    AW: VB 2008: Aus DataGridView drucken?

    Hallo,

    habe das gerade gefunden. Prima, funzt! Nur der Seitenumbruch geht nicht, wenn das Datagridview breiter ist als die Seite. Ich bekomme immer nur eine Seite angezeigt. Hasmorepages einfach auf true: Dann werden endlos Seiten generiert.

    Ich bitte um Hilfe, wenn möglich.

    Gruß + danke,

    Arno

    • IP-Adresse ist Registriert
  • 02-27-2010 9:21 Antwort zu

    • Peter_Punkt
    • Top 10 Mitwirkender
    • Registriert am 03-28-2007
    • VS Community 2015, VB, C#, Office 2010, Win 10
    • Beiträge 2.605

    AW: VB 2008: Aus DataGridView drucken?

    Diese Version kann noch keinen DataGridView drucken, der breiter als eine Seite ist (länger darf er schon sein). HasMorePages löst das Problem nicht.

    Ich werde im März mal eine neue Version machen, die auch breite DataGridView druckt.

    Zwar weiß ich viel, doch möcht' ich alles wissen.
    Dass ich erkenne, was die Welt im Innersten zusammenhält
    • IP-Adresse ist Registriert
  • 04-13-2010 18:35 Antwort zu

    • arnoau
    • Nicht gereiht
    • Registriert am 02-25-2010
    • Beiträge 4

    AW: VB 2008: Aus DataGridView drucken?

    Könntest du das bitte hier posten, wenn es fertig ist.

    Ich wäre dir sehr dankbar (und andere sicher auch).

    Gruß..

    • IP-Adresse ist Registriert
  • 05-24-2010 14:22 Antwort zu

    AW: VB 2008: Aus DataGridView drucken?

    Hey,

    reicht Dir das Drucken mit nem PrintDocument oder willst Du mit PrintDialog???

    Mit PrintDocument habe ich einen sehr guten Code!!! Wenn Du den noch brauchst melde Dich mal!!!

    LG

    • IP-Adresse ist Registriert
  • 05-25-2010 12:23 Antwort zu

    • arnoau
    • Nicht gereiht
    • Registriert am 02-25-2010
    • Beiträge 4

    AW: VB 2008: Aus DataGridView drucken?

    Hallo,PrintDocument reicht, den Dialog bekomme ich dann selbst rein, bzw. das steht schon. Aber super… Gruß, Arno

     

    • IP-Adresse ist Registriert
  • 05-25-2010 19:27 Antwort zu

    AW: VB 2008: Aus DataGridView drucken?

    Hat Dein DGV eine bestimmte Zeilenanzahl??? Oder ist das Variabel???
    • IP-Adresse ist Registriert
  • 05-26-2010 9:39 Antwort zu

    • arnoau
    • Nicht gereiht
    • Registriert am 02-25-2010
    • Beiträge 4

    AW: VB 2008: Aus DataGridView drucken?

    Die Zeilenanzahl soll wie die Spaltenanzahl variabel sein.

    Gruß!

    • IP-Adresse ist Registriert
  • 12-08-2011 10:09 Antwort zu

    • BeKos
    • Nicht gereiht
    • Registriert am 12-08-2011
    • Beiträge 2

    AW: VB 2008: Aus DataGridView drucken?

    Hallo! Also erstmal Danke für den Code. Ich war schon echt am Verzweifeln. Da steckt man ne Menge Zeit und Energie in ein Progrämmchen und scheitert dann am drucken. Ich hbae nur noch eine Frage. Ist es möglich einen Druckdialog zwischen vorschau und Druckvorgang zu schieben, so dass der User wählen kann dass der Drucker im Querformat druckt. Meine Tabelle ist leider zu breit für Hochformat DIN A 4. Ist schon was länger her aber ich hoffe dennoch auf Anregungen. Danke im Voraus.
    • IP-Adresse ist Registriert
Seite 1 von 1 (11 Treffer)