Drucken des Inhalts eines Datagridview / Dataset über mehrere Seiten in VB Net
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 63 Antworten in diesem Thema. Der letzte Beitrag () ist von silverbob76GE.
-
-
silverbob76GE schrieb:
Dieser wird nun auch auf Seite 2 gedruckt.PrintDocument
-Event wird für jede Seite einzeln aufgerufen.
Also setze einen Zähler, damit Du weißt, welche Seite Du gerade druckst.
Dieser Zähler wird imBeginPrint
-Event genullt.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@Akanel
Bin auch noch arbeiten. Werd mich gleich da reinhängen wenns noch geht.
Das maximum an Zeilen richtet sich nach den Positionen, die im DataTable vorhanden sind.
Ich schrebe ins Datatable über verschiedene Controls. Daruch werden die Zeilen (entsprechend die zugehörigen Spalten) gefüllt und im DatagridView angezeigt.
Jede Zeile im DataTable entspricht einer Position im Angebot. Wenn es nun mehrere Artikel gibt, die der kunde haben möchte, sind mehrere Zeilen vorhanden.
Die PDF teilt sich in 3 Bereiche auf.
Bereich 1: Briefkopf. ca. 15 Zeilen, statisch. SOll nicht wiederholt werden
Bereich 2: Artikelpositionen (Anzahl der Zeilen aus dem DataTable). Dieser Teil ist variabel und kann mehrere Seiten erfordern, je nach Artikelanzahl.
Bereich 3: Text hinter den Artikelpositionen, auch statisch. Wird nur hinter die Positionen gesetzt.
ich habe mir überlegt, das ich drei separate Sub's schreibe, die alle im PrintDocument-Printpage Event angerufen werden.
So würde die For-Schleife auch nur im Bereich 2 wiederholt werden..
Dazu muss ich aber festelegen, wo Bereich zwei anfängt. Auf Seite 1 wäre das z.B. Zeile 17, auf Seite 2 aber dann Zeile 1.
Hoffe du verstehst was ich meine.
@RodFromGermany:
Das PrintDocument-Event wird für jede Seite erneut aufgerufen, ok. Nur wenn ich den kompletten Aufbau der Seite (Briefkopf, Positionen, Endtext) hier drin stehen habe, wird ann nicht alles immer wieder auf jeder Seite neu gedruckt? Wie kann ich es hinbekommen, das Bereich 1 und Bereich 3 nicht wiederholt gedruckt werden, wenn das Event aufgerufen wird.
Im BeginPrint event habe ich einen Zähler hinzugefügt:
Der Wert pageNB muss ja dann mit steigender Seitenzahl auch erhöht werden um 1. Das müsste doch immer dann passieren wenn e.hasmorepages = true erzielt wird, richtig?
mfg, Silver
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „silverbob76GE“ ()
-
silverbob76GE schrieb:
Wie kann ich es hinbekommen, das Bereich 1 und Bereich 3 nicht wiederholt gedruckt werden, wenn das Event aufgerufen wird.
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany
Danke, hab viel zu kompliziert gedacht gerade. Da hätt ich bestimmt noch 3 tage probiert es hinzubekommen.
Edit:
also 3 Seitem bekomme ich nun auch gedruckt. Der Tip von @RodFromGermany war Gold Wert, danke nochmal.
Jetzt muss ich es nur noch hinebekommen, das der Druck da weiterläuft, wo er auf der vorherigen Seite aufgehört hat. Sprich, die letzte Zeile die im DataTable in der For-Schleife aufgerufen wurde, muss nun auf der Folgeseite fortgefürht werden mit der nächsten Zeile.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „silverbob76GE“ ()
-
-
silverbob76GE schrieb:
richtig?
Du solltest beim Drucken immer vom aktuellen Start bis zum seitenende drucken und Dir merken, wo das Seitenende ist. Da geht es bei der nächsten seite weiter.
Parallel dazu zählst Du die Seiten.
Ggf, ist es sinnvoll, bei geschlossenen Blöcken, die nicht getrennt werden sollen, einen "Druck ins Leere" zu machen, damit Du weißt, ob der Druck auf die Seite passt oder nicht,
dass Du also innerhalb eines Aufrufs desPrintPage
-Events zwei Durchläufe machst, trocken und scharf.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Hi @RodFromGermany
habe jetzt festgelegt, das nur bis Y = 900 gedruckt werden soll. Wenn 900 erreicht, dann soll eine neue Seite erzeugt werden.
Aber statt ne neue Seite zu erzeugen, wird der Text einfach auf Seite 1 wieder oben neu gedruckt.
pageNB habe ich im BeginPrint-Event auf 0 stehen.
Hab aber noch ein anderes Problem, und zwar mit dem DirectCast und der Bindingsource. Die Bindingsource bezieht sich nur auf die erste Zeile im Datatable, habe aber mehrere Zeilen die gedruckt werden sollen. Aktuell wird immer die erste Zeile gedruckt, bis die Zeilenanzahl im Datatable erreicht ist.
Der DIrectcast bezieht sich nur auf die erste Zeile, nicht auf die gesamte Datatable
VB.NET-Quellcode
- Dim currentpositionrow = DirectCast(DirectCast(EinzelangebotBindingSource.Current, DataRowView).Row, Kundenangebot.EinzelangebotRow)
- Y = 510
- For i = 0 To EinzelangebotBindingSource.Count - 1
- '.............
- Y = Y + 160
- g.DrawLine(pen1, X, Y - 10, X + 730, Y - 10)
- g.DrawString(String.Format(" - Seite {0} -", pageNB + 1), fntText, Brushes.Black, 380, 1120)
- If Y >= 900 Then
- pageNB += 1
- e.HasMorePages = True
- Y = 50
- Else
- e.HasMorePages = False
- End If
- Next
-
silverbob76GE schrieb:
oben neu gedruckt.For
-Schleife verlassen.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Wenn die Sewite voll ist, musst Du die For-Schleife verlassen.
Wenn ich die For-Schleife verlasse, dann wird immer wieder die gleiche Seite gedruckt. Die For-Schleife brauche ich, um die Bindingsource zu durchlaufen.
-
@silverbob76GE Du MUSST die For-Schleife verlassen, um auf die nächste Seite zu kommen.
Ich schlage vor, Du arbeitest zunächst das Tut mal durch und verstehst es (nicht nur anschauen): Drucken mehrseitiger DokumenteFalls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany
Um ehrlich zu sein. Ich blicks nicht. Hab mir das Tut so oft durchgelesen, selbst geschrieben um zu sehen was passiert.
Bei mir klappts einfach nicht, weil ich es nicht auf mein Modell anwenden kann. Hab halt keinen Fließtext wie in einer RichTextBox.
- Ich schreib den Briefkopf
- ich erzeuge eine Schleife zum durchlaufen des DataSets. Diese soll fortlaufen, bis die letzte Zeile im Dataset geschrieben wurde. Die Zeilenanzahl im DataSet kann von 1 bis 100 gehen, ganz egal.
- ich schreibe einen Schlußtext
Es soll eine neue Seite eingefügt werden, wenn die Y-Koordinate > 900.
Alles was ich erreich ist aber, das die erste Seite erzeugt wird und die DataSetzeilen auf der ersten Seite erneut gedruckt werden sowie der Schlußtext. Alle weiteren Seiten werden unendlich gedruckt und der Inhalt sieht dann so aus wie auf Seite 1, allerdings ohne das überdruckt wird.
Bin echt verzweifelt, weil ich es nicht raffe. Bin jetzt seit fast zwei Wochen an dem Problem und komm nicht weiter. -
@silverbob76GE Die wichtigste Erkenntnis ist wohl die, dass für jede Seite das
PrintPage
-Event genau ein Mal aufgerufen wird.
Wenn Du das verinnerlicht hast, sollte schon mal einiges besser laufen.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany - das habe ich ja verstanden. Weiß nur nicht wie ich es umsetzen kann.
Der Druck der ersten Seite funzt ja. Dann sag ich bei Y > 900 bitte neue Seite.
Im BeginPrint steht pageNB = 0. Im PrintPage-Event wird pageNB inkrementiert, wenn Y > 900 erreicht wird.
Es wird alles immer und immer wieder gedruckt. Das PrintPage-Event ist dafür verantwortlich, ist mir klar.
Das Event wird so oft aufgerufen, bis alles was gedruckt werden muss, auch gedruckt wurde. ich weiß nicht, wie ich das Printpage-Event im zweiten und n-ten Durchlauf an der Stelle durchlaufe, wo ich beim vorherigen mal aufgehört habe zu drucken. Weiß nicht, wie ich das anstellen soll.
Dachte, das wenn Y > 900 => e.hasmorepages = true dazu führt, das eine neue seite generiert wird, und der Druck an der Stelle weitergeht. Aber da spassiert halt nicht. -
@silverbob76GE Dann musst Du Dir die Position merken, in diesem Falle 900 und bis 1800 auf die zweite Seite drucken.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@silverbob76GE Sieht ganz gut aus.
Das solltest Du doch durch Probiren ganz fox herausbekommen.
Sieh Dir das ganze imPrintPreviewDialog
an, im Ernstfall kannst Du auch in ein PDF drucken.
Das geht alles ohne ein Blatt Papier.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Hi @RodFromGermany
das mit dem Druck der zweiten Siete klappt mittlerweile. Hab jetzt auch mit Select Case den Druckinhalt der einzelnen Seiten konfigurieren können.
Allerdings haperts immer noch mit der Tabelle. Hab ja ein typisiertes DataSet und auch eine Bindingsource. Und mit dem DirectCast kann ich die Spalten über die Bindignsource ansprechen.
Ich muss aber zeilenweise durch das DataSet durchlaufen, um unterschiedliche Zelleninhalte zu drucken.
Mit dem DirectCast wird immer nur die gleiche Zeile angesprochen. Irgend ne Idee wie ich mit dem DirectCast durch das ganze DataSet durchlaufen kann?
VB.NET-Quellcode
- Dim currentpositionrow = DirectCast(DirectCast(EinzelangebotBindingSource.Current, DataRowView).Row, Kundenangebot.EinzelangebotRow)
- Y = 500
- recordsperpage = 3
- For i = index To EinzelangebotBindingSource.Count - 1
- netto = currentpositionrow.Netto
- mwst = currentpositionrow.MwSt
- brutto = currentpositionrow.Brutto
- Dim j As Integer
- j = 10 + (currentrecord * 10)
- element = currentpositionrow.Element
- dicke = currentpositionrow.Kerndicke
- länge = currentpositionrow.Länge
- ep = currentpositionrow._Preis__inkl__Fracht_
Die Schleife bleibt immer in der gleichen Zeile und durchläuft nicht das DataSet. Dadurch werden immer die gleichen Zeilen gedruckt, was ja nicht richtig ist.
Wenn ich einen untypisierten Zugriff auf das DataSet einstelle, kann ich das DataSet durchlaufen
Wie bekomme ich das beim typisierten Zugriff hin?
lg, silver -
silverbob76GE schrieb:
Irgend ne Idee wie ich mit dem DirectCast durch das ganze DataSet durchlaufen kann?
imBindingContext
ist das die PropertyPosition
.
social.msdn.microsoft.com/Foru…rd?forum=adodotnetdatasetFalls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
@RodFromGermany
bedeutet dann:
Das funzt nicht, mache ich da noch was falsch? Muss ich die For schleife anders starten? Bekomme immer nur die erste Zeile im Druck.
-
Ähnliche Themen
-
MIT VB 2010 bestimmte Seiten eines PDF Dokuments drucken
Daniel Schepers - - Sonstige Problemstellungen
-
6 Benutzer haben hier geschrieben
- silverbob76GE (29)
- RodFromGermany (20)
- Dksksm (6)
- Akanel (5)
- VaporiZed (3)
- VB1963 (1)