Hallo liebe User im Forum,
ich arbeite gerade in VB net an einem Programm, welches ich zur Erstellung von Angeboten nutzen möchte.
Das Programm funzt auch soweit (Kalkulation, etc.). Nun will ich das Angebot gern ausrcuekn in Form einer mehrseitigen PDF.
Dazu habe ich mir den Beitrag von RodFormGermany (Drucken mehrseitiger Dokumente) auch schon angeschaut. Allerdings versteh ich nicht, wie ich die Zeilenanzahl über die einzufügenden Zeilen aus dem Datagrdiview zählen kann.
Mein Problem liegt darin, das ich als Quelle meiner Strings nicht eine Richtextxbox habe, sondern ein Datagridview.
Der Aufbau sieht folgendermaßen aus:
Über Controls wie ComboBox, TextBox, etc. wird eine Auswahl getroffen. Die Auswahl wird in ein gebundenes DataSet geschrieben. Das DataSet ist als DataSocurce an ein Datagridview gebunden, über das ich den Angebotsinhalt einsehen kann. Diesen Inhalt möchte ich nun inklusive einer Kopf- und Fußzeile ausdrucken. Der Ausdruck an sich funzt auch, allerdings bekomme ich immer nur eine Seite hin. Die weiteren Seiten werden nicht angezeigt.
Ich rufe über einen Button den Printpreview-Dialog auf, der zeigt mir immer nur eine Seite an. Irgendwie schaffe ich es nicht, das Datagridview per Schleife zu durchlaufen und bis zum Seitenende zu zählen, damit eine neue Seite generiert wird. Das Datagridview durchlaufe ich mit einer For Schleife. Das klappt auch alles. Leider scheitert es daran, das das Seitenende nicht erkannt wird.
Hab auch schon versucht, den "Zähler CurrentRecord" anzupassen, aber dann läuft beim erzeugen der Ansicht im Preview-Dialog der Zähler weiter und weiter und weiter.
Bin mir nicht sicher, ob das verständlich rüber kam. Will eigentlich eine mehrseitige PDF erzeugen, die eine Kopfzeile, den Angebotsinhalt (aus dem Datagridview) sowie eine Fußzeile hat. Im Moment klappts zwar mit der Kopfzeile, aber dann hänge ich beim Angebotsinhalt des Datagridview auf Seite 1. Eine weitere Seite wird nicht erzeugt.
In der PrintPreview-Ansicht wird die letzte Zeile am Seitenrand unten angezeigt, was ich nicht verstehe. Die nächste Seite wird einfach nicht erzeugt.
Hat jemand ne Idee und kann mir vielleicht einen Denkansatz geben? Bin nun seit einer Woche dadran und komme nicht weiter. Hab schon gegoogelt, mehrfach Sachen ausprobiert, nichts bringt mich weiter. Das Beispiel von RodFromGermany bezieht sich auf eine Richtextbox, leider weiß ich nicht wie ich das auf mein Datagridview anwenden kann.
Hier mal mein Code.
ich arbeite gerade in VB net an einem Programm, welches ich zur Erstellung von Angeboten nutzen möchte.
Das Programm funzt auch soweit (Kalkulation, etc.). Nun will ich das Angebot gern ausrcuekn in Form einer mehrseitigen PDF.
Dazu habe ich mir den Beitrag von RodFormGermany (Drucken mehrseitiger Dokumente) auch schon angeschaut. Allerdings versteh ich nicht, wie ich die Zeilenanzahl über die einzufügenden Zeilen aus dem Datagrdiview zählen kann.
Mein Problem liegt darin, das ich als Quelle meiner Strings nicht eine Richtextxbox habe, sondern ein Datagridview.
Der Aufbau sieht folgendermaßen aus:
Über Controls wie ComboBox, TextBox, etc. wird eine Auswahl getroffen. Die Auswahl wird in ein gebundenes DataSet geschrieben. Das DataSet ist als DataSocurce an ein Datagridview gebunden, über das ich den Angebotsinhalt einsehen kann. Diesen Inhalt möchte ich nun inklusive einer Kopf- und Fußzeile ausdrucken. Der Ausdruck an sich funzt auch, allerdings bekomme ich immer nur eine Seite hin. Die weiteren Seiten werden nicht angezeigt.
Ich rufe über einen Button den Printpreview-Dialog auf, der zeigt mir immer nur eine Seite an. Irgendwie schaffe ich es nicht, das Datagridview per Schleife zu durchlaufen und bis zum Seitenende zu zählen, damit eine neue Seite generiert wird. Das Datagridview durchlaufe ich mit einer For Schleife. Das klappt auch alles. Leider scheitert es daran, das das Seitenende nicht erkannt wird.
Hab auch schon versucht, den "Zähler CurrentRecord" anzupassen, aber dann läuft beim erzeugen der Ansicht im Preview-Dialog der Zähler weiter und weiter und weiter.
Bin mir nicht sicher, ob das verständlich rüber kam. Will eigentlich eine mehrseitige PDF erzeugen, die eine Kopfzeile, den Angebotsinhalt (aus dem Datagridview) sowie eine Fußzeile hat. Im Moment klappts zwar mit der Kopfzeile, aber dann hänge ich beim Angebotsinhalt des Datagridview auf Seite 1. Eine weitere Seite wird nicht erzeugt.
In der PrintPreview-Ansicht wird die letzte Zeile am Seitenrand unten angezeigt, was ich nicht verstehe. Die nächste Seite wird einfach nicht erzeugt.
Hat jemand ne Idee und kann mir vielleicht einen Denkansatz geben? Bin nun seit einer Woche dadran und komme nicht weiter. Hab schon gegoogelt, mehrfach Sachen ausprobiert, nichts bringt mich weiter. Das Beispiel von RodFromGermany bezieht sich auf eine Richtextbox, leider weiß ich nicht wie ich das auf mein Datagridview anwenden kann.
Hier mal mein Code.
VB.NET-Quellcode
- Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
- Dim g = e.Graphics
- Dim pen1 As New Pen(Brushes.Black, 0.5)
- 'Die Kopfzeilen zum Angebot
- Dim xAngebotstitel As Integer = CurrentX 'Kopfzeile - Zeile 1
- Dim xAngebotstitel2 As Integer = CurrentX 'Kopfzeile - Zeile 2
- Dim Currentrecord As Integer = 0
- Dim Recordsperpage As Integer = 20
- Dim pos As String
- Dim element As String
- Dim beschreibung As String
- Dim dicke As String
- Dim länge As String
- Dim stück As String
- Dim menge As String
- Dim ep As String
- Dim gp As String
- Dim mwst As Double
- Dim netto As Double
- Dim brutto As Double
- Dim fntText As Font = New Font("Calibri", 11, FontStyle.Regular)
- Dim margin = Me.PrintDocument1.DefaultPageSettings.Margins
- leftmargin = margin.Left
- rightMargin = margin.Right
- topmargin = margin.Top
- bottomMargin = margin.Bottom
- Angebotsbreite = margin.Left - margin.Right
- AngebotsHeight = margin.Top - margin.Bottom
- PrintDocument1.DocumentName = Label64.Text
- Kopfzeile1 = "Angebot an " & tbkunde.Text & " - vom " & Date.Now.ToShortDateString
- If tbanfragenummer.Text = "" Then
- Kopfzeile2 = "BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
- ElseIf tbanfragenummer.Text = "" And tbkommission.Text = "" Then
- Kopfzeile2 = "BV in " + tbplz1.Text + " " + tblieferort.Text
- ElseIf tbkommission.Text = "" Then
- Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV in " + tbplz1.Text + " " + tblieferort.Text
- Else
- Kopfzeile2 = "Anfragenummer " + tbanfragenummer.Text + " - BV " + tbkommission.Text + " in " + tbplz1.Text + " " + tblieferort.Text
- End If
- Logo = "c:\users\" + Environment.UserName + "\desktop\Logo.jpg"
- CurrentX = leftMargin - 60
- CurrentY = topMargin
- If File.Exists(Logo) Then
- Dim ologo As Image = Image.FromFile(Logo)
- Dim bmp As New Bitmap(ologo, 180, 95)
- g.DrawImage(bmp, 600, 30)
- End If
- Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
- Subtitelschrifthöhe = Convert.ToInt32(Subtitelschrift.GetHeight(g))
- If (Kopfzeile1 <> "") Then
- CurrentY = CurrentY
- g.DrawString(Kopfzeile1, Angebotstitelschrift, Brushes.Black, CurrentX, CurrentY - 70)
- End If
- If (Kopfzeile2 <> "") Then
- CurrentY = CurrentY + Angebotstitelschrifthöhe
- g.DrawString(Kopfzeile2, Angebotstitelschrift, Brushes.Black, CurrentX, CurrentY - 65)
- End If
- Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
- 'Druckdaten zu Firma setzen
- CurrentX = leftMargin - 60
- CurrentY = CurrentY + 50
- 'Die Zeilen an den Kunden
- g.DrawString("Angebot an" & vbTab & vbTab & ": " & tbkunde.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 20)
- g.DrawString("Ansprechpartner" & vbTab & vbTab & ": " & tbansprech.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 40)
- g.DrawString("Anfragenummer" & vbTab & vbTab & ": " & tbanfragenummer.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 60)
- g.DrawString("PLZ / Lieferort" & vbTab & vbTab & ": " & tbplz1.Text & " / " & tblieferort.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 80)
- g.DrawString("BV / Kommission" & vbTab & vbTab & ": " & tbkommission.Text, fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 100)
- 'Die Zeilen für Verkauf und Innendienst
- Dim xverkauf As Integer = leftMargin + 350
- g.DrawString("Verkaufsleiter" & vbTab & ": " & cboVerkaufsleiter.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 20)
- g.DrawString("Tel." & vbTab & vbTab & ": " & tbtelA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 40)
- g.DrawString("Fax." & vbTab & vbTab & ": " & tbfaxA.Text, fntText, Brushes.Black, xverkauf, CurrentY + Angebotstitelschrifthöhe + 60)
- 'Angebotsdatum
- g.DrawString(Date.Now.ToShortDateString, fntText, Brushes.Black, xverkauf + 250, CurrentY + Angebotstitelschrifthöhe + 230)
- 'Angebotstext
- g.DrawString("Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf & "wir danken Ihnen für Ihre Anfrage und unterbreiten Ihnen unser für Sie kostenlos ausgearbeitetes Angebot wie folgt:", fntText, Brushes.Black, CurrentX, CurrentY + Angebotstitelschrifthöhe + 250)
- 'Dim pen1 As Pen = New Pen(Brushes.Black, 0.8)
- Dim mybrush As SolidBrush = New SolidBrush(Color.LightGray)
- Angebotstitelschrifthöhe = Convert.ToInt32(Angebotstitelschrift.GetHeight(g))
- CurrentY = topMargin + 400
- e.Graphics.FillRectangle(mybrush, leftMargin - 60, CurrentY, 750, 25)
- 'tbkunde.Text = Kundenangebot.Einzelangebot.Rows(0).Item("Firma").ToString
- 'Tabellenkopfzeilen
- CurrentX = leftMargin - 50
- Dim xPos As Integer = CurrentX + 5
- Dim XBeschreibung As Integer = xPos + 35
- Dim xLänge As Integer = XBeschreibung + 320
- Dim xStück As Integer = xLänge + 80
- Dim xMenge As Integer = xStück + 80
- Dim xEP As Integer = xMenge + 80
- Dim xGP As Integer = xEP + 70
- Dim ipos As Integer = 0
- Dim yPosinhalt As Integer = CurrentY + 30
- e.Graphics.DrawString("Pos.", fntText, Brushes.Black, CurrentX, CurrentY + 4)
- e.Graphics.DrawString("Beschreibung", fntText, Brushes.Black, XBeschreibung, CurrentY + 4)
- e.Graphics.DrawString("Länge", fntText, Brushes.Black, xLänge, CurrentY + 4)
- e.Graphics.DrawString("Stück", fntText, Brushes.Black, xStück, CurrentY + 4)
- e.Graphics.DrawString("Menge", fntText, Brushes.Black, xMenge, CurrentY + 4)
- e.Graphics.DrawString("EP (€)", fntText, Brushes.Black, xEP, CurrentY + 4)
- e.Graphics.DrawString("GP (€)", fntText, Brushes.Black, xGP, CurrentY + 4)
- ' Tabelleninhalt zeichnen
- CurrentY = CurrentY + Angebotstitelschrifthöhe + 20
- Dim intstart As Integer = 0
- Dim txtheight As Integer
- txtheight = PrintDocument1.DefaultPageSettings.PaperSize.Height - PrintDocument1.DefaultPageSettings.Margins.Top - PrintDocument1.DefaultPageSettings.Margins.Bottom
- Dim linesperpage As Integer = CInt(Math.Round(txtheight / (fntText.Height + 0.5)))
- 'e.Graphics.DrawRectangle(Pens.Red, e.MarginBounds)
- Dim i As Integer
- For i = 0 To DataGridView1.RowCount - 2
- netto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString)
- mwst = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("MwSt").ToString)
- brutto = CDbl(Kundenangebot.Einzelangebot.Rows(i).Item("Brutto").ToString)
- brutto = netto + mwst
- Dim j As Integer
- j += 10
- pos = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
- element = Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
- dicke = Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString
- beschreibung = "Kerndicke" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Kerndicke").ToString _
- & vbCrLf _
- & "Dämmkern" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Dämmkern").ToString & vbCrLf _
- & "U-Wert" & vbTab & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("U-Wert").ToString & " W/m²K" & vbCrLf _
- & "Stahldicke (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Stahldicke (A/I)").ToString & vbCrLf _
- & "Profilierung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Profilierung (A/I)").ToString & vbCrLf _
- & "Beschichtung (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Beschichtung (A/I)").ToString & vbCrLf _
- & "Farbton (A/I)" & vbTab & vbTab & Kundenangebot.Einzelangebot.Rows(i).Item("Farbton (A/I)").ToString
- länge = Kundenangebot.Einzelangebot.Rows(i).Item("Länge").ToString
- stück = Kundenangebot.Einzelangebot.Rows(i).Item("Stück").ToString
- menge = Kundenangebot.Einzelangebot.Rows(i).Item("Menge").ToString
- ep = Kundenangebot.Einzelangebot.Rows(i).Item("Preis (inkl. Fracht)").ToString
- gp = Kundenangebot.Einzelangebot.Rows(i).Item("Netto").ToString
- element = Kundenangebot.Einzelangebot.Rows(i).Item("Anwendung").ToString & " " & Kundenangebot.Einzelangebot.Rows(i).Item("Element").ToString
- g.DrawString(CStr(j), fntText, Brushes.Black, xPos, CurrentY) 'Pos
- g.DrawString(element, fntText, Brushes.Black, XBeschreibung, CurrentY) 'Element
- g.DrawString(beschreibung, fntText, Brushes.Black, XBeschreibung, CurrentY + 20)
- g.DrawString(länge, fntText, Brushes.Black, xLänge, CurrentY) 'Länge
- g.DrawString(stück, fntText, Brushes.Black, xStück, CurrentY) 'Stück
- g.DrawString(menge, fntText, Brushes.Black, xMenge, CurrentY) 'Menge
- g.DrawString(ep, fntText, Brushes.Black, xEP, CurrentY) 'EP
- g.DrawString(gp, fntText, Brushes.Black, xGP, CurrentY) 'GP
- CurrentY = CurrentY + Angebotstitelschrifthöhe + 150
- g.DrawLine(pen1, CurrentX, CurrentY - 10, CurrentX + 730, CurrentY - 10)
- g.DrawString(String.Format(" - Seite {0} -", pageNb + 1), fntText, Brushes.Black, 380, 1120)
- Currentrecord += 1
- Next
- If Currentrecord < Recordsperpage Then
- e.HasMorePages = False
- Else
- e.HasMorePages = True
- End If
- CurrentY = CurrentY + 20
- Dim xPos1 As Integer = leftMargin + 550
- Dim i1 As Integer
- Dim netto1 As Double
- Dim mwst1 As Double
- Dim brutto1 As Double
- For i1 = 0 To DataGridView1.Rows.Count - 2
- netto1 += CDbl(DataGridView1.Rows(i1).Cells(14).Value)
- Next
- mwst1 = netto * 0.19
- brutto1 = netto + mwst
- lblgesamtnetto.Text = Format(netto, "#,##.00")
- lblgesamtmwst.Text = Format(mwst, "#,##.00")
- lblgesamtbrutto.Text = Format(brutto, "#,##.00")
- g.DrawString("Netto", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY)
- g.DrawString(lblgesamtnetto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY)
- g.DrawString("MwSt", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 20)
- g.DrawString(lblgesamtmwst.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY + 20)
- g.DrawString("Brutto", Angebotstitelschrift, Brushes.Black, xPos1, CurrentY + 40)
- g.DrawString(lblgesamtbrutto.Text, Angebotstitelschrift, Brushes.Black, xPos1 + 80, CurrentY + 40)
- End Sub[vbnet]