# Form drucken vb.net



## werner_sg (30. Juni 2021)

Hallo ich habe einmal die rechnung.designer.vb welche das Design der zu druckenden Form enthält
und dann noch die zahlung.vb

in der zahlung.vb habe ich einen Button welcher die ganzen Daten an die rechnung.designer.vb übergibt und abschließend die Form auch öffnet

das öffnen und die übergabe funktioniert fehlerfrei.

Jetzt würde ich gerne das die rechnung auch ausgedruckt wird, habe dazu nichts passendes gefunden, das meiste war veraltet oder die erklärung mit Toolbox (nicht verfügbar) 

hier mal den Part welcher die Daten übergibt und die Form öffnet


```
Private Sub Btnreceipt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnreceipt.Click
        conn.Open()


        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblmieter where ID like '" & Reservierung.TxtKundenNummer.Text & "%'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Geburtsdatum = (DbReader("MIETER_GEBURTSDATUM").ToString)
                Dim FSKlassen = (DbReader("KLASSEN").ToString)
                Dim FSAblauf = (DbReader("ABLAUFDATUM").ToString)

                Dim Leer = "  ".ToString
                rechnung.LabelGeburtsdatum1.Text = Geburtsdatum
                rechnung.LabelKlassen1.Text = FSKlassen
                rechnung.LabelAblaufdatum1.Text = FSAblauf

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblfahrzeuge where KFZ_NUMMER like '" & Reservierung.TxtFahrzeugNummer.Text & "%'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Sorte = (DbReader("KRAFTSTOFF").ToString)

                rechnung.Sorte1.Text = Sorte

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Try
            Dim ID = 1
            dbcmd = New OleDbCommand("SELECT * FROM tblfirma where ID like '" & ID & "'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Firma = (DbReader("FIRMA").ToString)
                Dim PLZ = (DbReader("PLZ_ORT").ToString)
                Dim Strasse = (DbReader("STRASSE_NR").ToString)
                Dim Tel = (DbReader("TELEFON1").ToString)
                Dim Mail = (DbReader("EMAIL").ToString)
                Dim Standort = (DbReader("HAUPTSTANDORT").ToString)
                Dim Inhaber = (DbReader("INHABER").ToString)
                Dim Steuer = (DbReader("STEUER_ID").ToString)
                Dim Leer = "  ".ToString

                rechnung.LabelFirma.Text = Firma
                rechnung.LabelAdresse.Text = (PLZ + Leer + Strasse)
                rechnung.LabelPhone.Text = Tel
                rechnung.LabelMail.Text = Mail
                rechnung.LabelHalter1.Text = Inhaber
                rechnung.LabelHauptstandort1.Text = Standort

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()

        rechnung.LabelMieter1.Text = Reservierung.CboxMieter.Text
        rechnung.Label11.Text = TxtSumme.Text
        rechnung.Label12.Text = txtamountreceived.Text
        rechnung.Label13.Text = txtchange.Text
        rechnung.LabelBetrag1.Text = TxtRG.Text
        rechnung.LabelBuchungsnummer1.Text = Reservierung.TxtBuchungsnummer.Text
        rechnung.LabelFahrzeug1.Text = Reservierung.CboxFahrzeug.Text
        rechnung.LabelKennzeichen1.Text = Reservierung.Txtfahrzeugkennzeichen.Text
        rechnung.LabelFahrzeugNr1.Text = Reservierung.TxtFahrzeugNummer.Text
        rechnung.LabelMieter1.Text = Reservierung.CboxMieter.Text
        rechnung.LabelFahrerlaubnis1.Text = Reservierung.TxtFSNummer.Text
        rechnung.LabelAusweis1.Text = Reservierung.TxtAusweisNummer.Text
        rechnung.LabelKaution1.Text = TxtKaution.Text
        rechnung.Mietbegin1.Text = Reservierung.DateTimePicker1.Text
        rechnung.Mietende1.Text = Reservierung.DateTimePicker2.Text
        rechnung.Abgabe1.Text = Reservierung.TxtAbgabeort.Text
        rechnung.Abholung1.Text = Reservierung.TxtAbholort.Text
        rechnung.Kilometer1.Text = Reservierung.Txtkilometer.Text
        rechnung.Tank1.Text = Reservierung.TxtTankinhalt.Text
        rechnung.Mangel1.Text = Reservierung.TxtSchaden.Text
        rechnung.LabelKreditkarte1.Text = Kreditkarte1.Text
        rechnung.Kasko1.Text = Reservierung.CboxKasko.Text

        rechnung.Show()


    End Sub
```


----------



## werner_sg (30. Juni 2021)

Hab mal folgendes Eingebaut


```
Inherits Form
    Private WithEvents printDocument1 As New PrintDocument

    Dim memoryImage As Bitmap
```


```
Private Sub CaptureScreen()
        Dim myGraphics As Graphics = rechnung.CreateGraphics()
        Dim s As Size = rechnung.Size
        memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
        Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(rechnung.Location.X, rechnung.Location.Y, 0, 0, s)
    End Sub

    Private Sub printDocument1_PrintPage(ByVal sender As System.Object,
       ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
       printDocument1.PrintPage
        e.Graphics.DrawImage(memoryImage, 0, 0)
    End Sub
```


```
Private Sub Btnreceipt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnreceipt.Click
        conn.Open()


        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblmieter where ID like '" & Reservierung.TxtKundenNummer.Text & "%'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Geburtsdatum = (DbReader("MIETER_GEBURTSDATUM").ToString)
                Dim FSKlassen = (DbReader("KLASSEN").ToString)
                Dim FSAblauf = (DbReader("ABLAUFDATUM").ToString)

                Dim Leer = "  ".ToString
                rechnung.LabelGeburtsdatum1.Text = Geburtsdatum
                rechnung.LabelKlassen1.Text = FSKlassen
                rechnung.LabelAblaufdatum1.Text = FSAblauf

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblfahrzeuge where KFZ_NUMMER like '" & Reservierung.TxtFahrzeugNummer.Text & "%'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Sorte = (DbReader("KRAFTSTOFF").ToString)

                rechnung.Sorte1.Text = Sorte

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Try
            Dim ID = 1
            dbcmd = New OleDbCommand("SELECT * FROM tblfirma where ID like '" & ID & "'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Dim Firma = (DbReader("FIRMA").ToString)
                Dim PLZ = (DbReader("PLZ_ORT").ToString)
                Dim Strasse = (DbReader("STRASSE_NR").ToString)
                Dim Tel = (DbReader("TELEFON1").ToString)
                Dim Mail = (DbReader("EMAIL").ToString)
                Dim Standort = (DbReader("HAUPTSTANDORT").ToString)
                Dim Inhaber = (DbReader("INHABER").ToString)
                Dim Steuer = (DbReader("STEUER_ID").ToString)
                Dim Leer = "  ".ToString

                rechnung.LabelFirma.Text = Firma
                rechnung.LabelAdresse.Text = (PLZ + Leer + Strasse)
                rechnung.LabelPhone.Text = Tel
                rechnung.LabelMail.Text = Mail
                rechnung.LabelHalter1.Text = Inhaber
                rechnung.LabelHauptstandort1.Text = Standort

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()

        rechnung.LabelMieter1.Text = Reservierung.CboxMieter.Text
        rechnung.Label11.Text = TxtSumme.Text
        rechnung.Label12.Text = txtamountreceived.Text
        rechnung.Label13.Text = txtchange.Text
        rechnung.LabelBetrag1.Text = TxtRG.Text
        rechnung.LabelBuchungsnummer1.Text = Reservierung.TxtBuchungsnummer.Text
        rechnung.LabelFahrzeug1.Text = Reservierung.CboxFahrzeug.Text
        rechnung.LabelKennzeichen1.Text = Reservierung.Txtfahrzeugkennzeichen.Text
        rechnung.LabelFahrzeugNr1.Text = Reservierung.TxtFahrzeugNummer.Text
        rechnung.LabelMieter1.Text = Reservierung.CboxMieter.Text
        rechnung.LabelFahrerlaubnis1.Text = Reservierung.TxtFSNummer.Text
        rechnung.LabelAusweis1.Text = Reservierung.TxtAusweisNummer.Text
        rechnung.LabelKaution1.Text = TxtKaution.Text
        rechnung.Mietbegin1.Text = Reservierung.DateTimePicker1.Text
        rechnung.Mietende1.Text = Reservierung.DateTimePicker2.Text
        rechnung.Abgabe1.Text = Reservierung.TxtAbgabeort.Text
        rechnung.Abholung1.Text = Reservierung.TxtAbholort.Text
        rechnung.Kilometer1.Text = Reservierung.Txtkilometer.Text
        rechnung.Tank1.Text = Reservierung.TxtTankinhalt.Text
        rechnung.Mangel1.Text = Reservierung.TxtSchaden.Text
        rechnung.LabelKreditkarte1.Text = Kreditkarte1.Text
        rechnung.Kasko1.Text = Reservierung.CboxKasko.Text

        rechnung.Show()
        CaptureScreen()
        printDocument1.Print()


    End Sub
```

im letzten teil nach rechnung.show()

        CaptureScreen()
        printDocument1.Print()

Ok damit ruft er das Druckmenü auf und druckt einen Screenshot vom Display

bis dahin ist aber die Form noch nicht geladen da gibt es doch 

a. schönere Wege als als bmp wegen der Qualität des druckes 
und b. die Möglichkeit den Druck erst dann zu starten wenn die Form vollständig geladen und angezeigt wird
sowie c. auch wirklich nur die Form und nicht mehr 
so druckt er auch etwas um die form herum mit aus kann unter anderem auch an der Form größe liegen


----------



## werner_sg (30. Juni 2021)

Ok mit 


```
rechnung.Show()
        Application.DoEvents()
        CaptureScreen()
        printDocument1.Print()
```

habe ich es hinbekommen er druckt jetzt nur das gewünschte Formular

wobei aber immer noch links vom Formular ein kleiner Streifen vom Hintergrund zu sehen ist


```
Private Sub CaptureScreen()
        Dim myGraphics As Graphics = rechnung.CreateGraphics()
        Dim s As Size = rechnung.Size
        memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
        Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(rechnung.Location.X, rechnung.Location.Y, 0, 0, s)
    End Sub

    Private Sub printDocument1_PrintPage(ByVal sender As System.Object,
       ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
       printDocument1.PrintPage
        e.Graphics.DrawImage(memoryImage, 0, 0)
    End Sub
```

die größe des Druckbereiches holt er sich ja von der Form wie kann ich das unterbinden das er links etwas mehr holt als er soll?

Und was auch noch absolut grausig ist, die Qualität lässt zu wünschen übrig

häng mal die pdf mit drann von der Ausgabe


----------



## werner_sg (30. Juni 2021)

Achja und die Kopfzeile sollte nicht mit gespeichert werden


----------



## werner_sg (2. Juli 2021)

habe fertig


----------

