none
Page und PageCount bei printPage RRS feed

  • Frage

  • Hallo,

    nachdem ich nun den REchnungsdruck so hinbekommen habe ich wie ich es gerne haben wollte, stehe ich nun vor der nächsten Aufgabe.

    Ich benötige je Rechnung und Rechnungsseite die ich drucke, die aktuelle Seite (kein Problem) und die Gesamtzahl der Seiten der Rechnung. Wobei hier auch mehrere Rechnungen hintereinander gedruckt werden können.

    Wie kann ich das mit der Gesamtzahl Seiten je Rechnung am einfachsten lösen? Ich habe bislang keine vernünftige Idee hierzu.

    Freitag, 10. Dezember 2010 07:23

Antworten

  • Hallo T

    genauso wie du die Kriterien für HasMorePages  berechnest, musst du dies (vorab) 'virtuell' (lies: 'trocken') selber übers ganze Dokument berechnen.
    Die Grösse des bedruckbaren Bereichs einer Seite ist ja im PrintDocument usw verfügbar.
    Ansonst genügt es oft, dies 'live' beim ersten Print-Event zu machen, also anhand der aktuellen (ersten) Seite 'hochrechnen'.
    Freitag, 10. Dezember 2010 07:37
  • Hallo,

    übliche Berichtsprogramme (z. B. Microsoft Access Reports, SQL Server Reporting Services)
    durchlaufen einen Bericht in (mindestens) zwei Phasen.
    Im ersten Schritt werden die Größe der Bereiche - Seitenkopf, -fuss, Gruppierungen, Detailzeilen usw. - ermittelt,
    wobei dazu die Daten zur Verfügung gestellt werden (um variable Größen von Zeilen zu berechnen).
    Die so ermittelten Größen werden gesammelt und zur Berechnung für die verfügbare Seitengröße herangezogen.
    Damit wird dann in der zweiten Phase der eigentliche Berichtsdruck vorgenommen.

    Um das mit .NET selbst (in vereinfachter Form) zu machen, solltest Du Dir eine eigene Ableitung von PrintDocument erstellen.
    Für die unterstützten Bereiche erstelle jeweils zwei virtuelle Methoden:
    Zum einen MeasureXXX (z. B. MeasurePageHeader, MeasureDetail), die Dir die Größe (Size oder Rectangle) zurückliefern.
    Das kann im einfachen Fall ein konstanter Wert sein, wenn die Werte fix sind,
    oder aber variable über die MeasureString  etc. ermittelt werden.

    Die dabei gelieferten Werte kannst Du dann mit den PageSettings zu verrechnen.
    (Bei komplexeren Dingen wie Gruppierungen kann es schwieriger werden...)

    Für die zweite Phase erstellst Du eine zweite Gruppe von Methoden wie PrintXXX (z. B. PrintPageHeader, PrintDetail)
    die den eigentlichen Druck durchführen.

    Ein Beispiel (mit etwas anderem als dem von mir beschriebenen Vorgehen)
    findest Du unter Printing Reports in Windows Forms

    Ist Dir das alles zu aufwändig, wäre solltest Du den Rückgriff auf die ReportViewer Steuerelemente überlegen.

    Gruß Elmar

    Freitag, 10. Dezember 2010 08:42
    Beantworter

Alle Antworten

  • Hallo T

    genauso wie du die Kriterien für HasMorePages  berechnest, musst du dies (vorab) 'virtuell' (lies: 'trocken') selber übers ganze Dokument berechnen.
    Die Grösse des bedruckbaren Bereichs einer Seite ist ja im PrintDocument usw verfügbar.
    Ansonst genügt es oft, dies 'live' beim ersten Print-Event zu machen, also anhand der aktuellen (ersten) Seite 'hochrechnen'.
    Freitag, 10. Dezember 2010 07:37
  • Hallo,

    übliche Berichtsprogramme (z. B. Microsoft Access Reports, SQL Server Reporting Services)
    durchlaufen einen Bericht in (mindestens) zwei Phasen.
    Im ersten Schritt werden die Größe der Bereiche - Seitenkopf, -fuss, Gruppierungen, Detailzeilen usw. - ermittelt,
    wobei dazu die Daten zur Verfügung gestellt werden (um variable Größen von Zeilen zu berechnen).
    Die so ermittelten Größen werden gesammelt und zur Berechnung für die verfügbare Seitengröße herangezogen.
    Damit wird dann in der zweiten Phase der eigentliche Berichtsdruck vorgenommen.

    Um das mit .NET selbst (in vereinfachter Form) zu machen, solltest Du Dir eine eigene Ableitung von PrintDocument erstellen.
    Für die unterstützten Bereiche erstelle jeweils zwei virtuelle Methoden:
    Zum einen MeasureXXX (z. B. MeasurePageHeader, MeasureDetail), die Dir die Größe (Size oder Rectangle) zurückliefern.
    Das kann im einfachen Fall ein konstanter Wert sein, wenn die Werte fix sind,
    oder aber variable über die MeasureString  etc. ermittelt werden.

    Die dabei gelieferten Werte kannst Du dann mit den PageSettings zu verrechnen.
    (Bei komplexeren Dingen wie Gruppierungen kann es schwieriger werden...)

    Für die zweite Phase erstellst Du eine zweite Gruppe von Methoden wie PrintXXX (z. B. PrintPageHeader, PrintDetail)
    die den eigentlichen Druck durchführen.

    Ein Beispiel (mit etwas anderem als dem von mir beschriebenen Vorgehen)
    findest Du unter Printing Reports in Windows Forms

    Ist Dir das alles zu aufwändig, wäre solltest Du den Rückgriff auf die ReportViewer Steuerelemente überlegen.

    Gruß Elmar

    Freitag, 10. Dezember 2010 08:42
    Beantworter