Laden...

[gelöst] Seitenwechsel beim Drucken

Erstellt von User4999 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.043 Views
U
User4999 Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren
[gelöst] Seitenwechsel beim Drucken

Hi,

ich hab mithilfe des Printdocuments mir selber eine Druckfunktion zusammengebastelt die im Prinzip auch das erfüllt was ich brauche (auch wenn der Quellcode sicher nicht allzu toll ist). Ich habe jetzt nur ein Problem mit den Seitenwechseln. Und zwar gehts einerseits um die automatischen Seitenwechsel und dann wiederum um manuelle Seitenwechsel (also wo ich sag "Hier musst du jetzt eine neue Seite starten").
Zum Hintergrund:
Ich führe eine Abfrage in einer Datenbank durch und möchte das Ergebnis nach einer bestimmten Spalte sortiert und mit ein paar Informationen die nicht in Tabellenform vorliegen drucken. Dazu leg ich mir erst ein String-Array an, das alle Werte die in der Spalte vorkommen beinhaltet. Danach gehe ich mit einer for-Schleife durch das Array und drucke am Anfang eines Schleifendurchlaufs die zusätzlichen Information und anschließen alle Datensätze (gekürzt) die den entsprechenden Wert enthalten. Das funktiniert soweit auch.
Wie bewerkstellige ich jetzt den Seitenwechsel wenn die Seite voll ist?
Wenn jetzt alle Datensätze gedruckt sind und der nächste Wert an der Reihe ist, möchte ich dann auch auf einer neuen Seite beginnen, wie geht das?

Ich habe schon mit dem Wert "HasMorePages" von den PrintPageEventArgs rumprobiert aber es ist alles auf die 1. Seite gedruckt worden.

Gruß Zocker

PS: Im Prinzip soll der Ausdruck dann folgenden Aufbau haben:

Zusatzinfo1 zu Wert1
Zusatzinfo2 zu Wert1
...

Datensatz1 zu Wert1
Datensatz2 zu Wert1
...
(neue Seite
...
Datensatz n zu Wert1
Datensatz n+1 zu Wert1
...)

neue Seite

Zusatzinfo1 zu Wert2
Zusatzinfo2 zu Wert2
...

Datensatz1 zu Wert2
Datensatz2 zu Wert2
...
(neue Seite
...
Datensatz n zu Wert2
Datensatz n+1 zu Wert2
...)

B
1.529 Beiträge seit 2006
vor 17 Jahren

Du darfst einfach nur soweit drucken, bis ein Seitenwechsel erfolgen soll.
Dann setzt du HasMorePages auf true und kehrst aus der Methode zurück.

Anschliessend wird das Event wieder aufgerufen und du kannst dort weitermachen, wo du aufgehört hast.

Sehr ausführlich und nahezu selbsterklärend ist das Beispiel in der MSDN für VS 2005 zu PrintDocument.PrintPage Event.

Wenn du diese nicht hast, siehe online unter http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfsystemdrawingprintingprintdocumentclassprintpagetopic.asp

U
User4999 Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

So einfach ist das also (hört sich zumindest einfach an) ^^

Wenn ich jetzt aber aus dem Event rausspringe und das Event neu aufgerufen wird dann werden ja auch alle Variablen (z.B. für die Schleife) wieder auf den Startwert gesetzt oder?
Wie stelle ich jetzt aber fest das die Seite voll ist?

B
1.529 Beiträge seit 2006
vor 17 Jahren

Schau dir das Beispiel mal an.

Dort wird eine lokale Variable (count) benutzt, um zu zählen, wie viele Zeilen auf diese Seite ausgegeben werden.


int count = 0;
/// ...
while ( count < linesPerPage )
   {
       // hier eine Zeile drucken
       count++;
   }

Im Beispiel wird der Text ja aus einer Datei in den string line gelesen.
Daher am Ende:


// If more lines exist, print another page.
if (line != null) 
   ev.HasMorePages = true;
else 
   ev.HasMorePages = false;

Du müsstest dann in einer Instanzvariable vermerken, bis wohin du bereits gedruckt hast.


public class ...
{
    private int NextLineToBePrinted = 0;
    private string[] LinesToPrint;
    ...
    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
         // Zeilenzahl wie im Beispiel angegeben berechnen
         //
         while((count < linesPerPage) && (NextLineToBePrinted < LinesToPrint.Length))
         {
            // hier eine Zeile drucken
            ev.Graphics.DrawString( LinesToPrint[NextLineToBePrinted], ... );
            count++;
            NextLineToBePrinted++;
         }
         /// ...
         if (NextLineToBePrinted < LinesToPrint.Length)
             ev.HasMorePages = true;
         else 
             ev.HasMorePages = false;
    }
}

U
User4999 Themenstarter:in
134 Beiträge seit 2006
vor 17 Jahren

Hi Borg,

Danke für deine Hilfe. Ich hab es jetzt geschafft mit den Seitenwechseln. Ich musste lediglich meine Schleifen ein klein wenig modifizieren. Beim Zeilen berechnen musste ich aber aufpassen, weil so wie die es in der MSDN berechnet haben habe ich zuviel Zeilen bekommen. Habe dann am Ende einen Teststring mit Measurestring() ausmessen lassen und diese Höhe verwendet.

Gruß Zocker

B
1.529 Beiträge seit 2006
vor 17 Jahren

Hi Zocker,

freut mich zu hören, dass du es jetzt geschafft hast.