Announcement

Collapse
No announcement yet.

Drucken mehrerer Seiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Drucken mehrerer Seiten

    Hiho,

    ich hab ein kleines Problem mit Drucken von mehreren Seiten. Ich habe schon einiges gegoogled, aber komme trotzdem leider nicht weiter.

    Ich weiss das ich dem PrintPageEventArgs mit HasMorePages=true sagen muss das es noch mehr Seiten gibt. Irgendwann muss ich dem Event auch noch sagen gibt keine weiteren Seiten. (Sonst druckt er die erste Seite seeehr oft )

    Ich hoff soweit bin ich richtig.

    Ich habe, auch hier im Forum, Code gesehen wie man mit einer While-Schleife die Sache mit HasMorePages regelt.

    Ich hole meine Daten die ich Drucken möchte aus einer ListView, ich bekomme es aber nicht hin das ich mehrere Seiten ausdrucken kann.

    Kann mir jemand sagen wo ich die Sache mit HasMorePages in meinem Code einsetzen muss das es hinhaut? (Wenn es in dem Fall überhaupt geht)

    Code:
            private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
            {
                Pen pen = new Pen(Color.Black);
                Font font = new Font("Arial", 14);
    
                if (this.monthCalendar1.SelectionStart.ToShortDateString() != this.monthCalendar1.SelectionEnd.ToShortDateString())
                {
                    string title = "Ausgaben vom: " + this.monthCalendar1.SelectionStart.ToShortDateString() + " - " + this.monthCalendar1.SelectionEnd.ToShortDateString();
                    e.Graphics.DrawString(title, font, Brushes.Black, 35, 25);
                    e.Graphics.DrawLine(pen, 35, 50, 500, 50);
    
                }
                else
                {
                    string title = "Ausgaben am: " + this.monthCalendar1.SelectionStart.ToShortDateString();
                    e.Graphics.DrawString(title, font, Brushes.Black, 35, 25);
                    e.Graphics.DrawLine(pen, 35, 50, 500, 50);
    
                }
                font = new Font("Arial", 11);
                int k = 0, l = 0;
    
                    for (int i = 1; i <= Convert.ToInt16(this.listView1.Groups.Count); i++)
                    {
                        l = 0;
    
                        for (int j = 0; j < (Convert.ToInt16(this.listView1.Items.Count)); j++)
                        {
                                if (this.listView1.Groups[i - 1].ToString() == this.listView1.Items[j].Group.ToString())
                                {
                                    if (l == 0)
                                    {
                                        font = new Font("Arial", 11, FontStyle.Bold);
                                        k = k + 2;
                                        e.Graphics.DrawString(this.listView1.Groups[i - 1].ToString(), font, Brushes.Black, 35, 50 + k * 25);
                                        e.Graphics.DrawLine(pen, 35, 70 + k * 25, 775, 70 + k * 25);
                                        l = 1;
                                        k++;
                                    }
                                    font = new Font("Times New Roman", 11);
                                    e.Graphics.DrawString(this.listView1.Items[j].Text.ToString(), font, Brushes.Black, 150, 75 + k * 25);
                                    e.Graphics.DrawString(this.listView1.Items[j].SubItems[1].Text.ToString(), font, Brushes.Black, 580, 75 + k * 25);
                                    e.Graphics.DrawString(this.listView1.Items[j].SubItems[2].Text.ToString(), font, Brushes.Black, 670, 75 + k * 25);
                                    e.Graphics.DrawString(this.listView1.Items[j].SubItems[3].Text.ToString(), font, Brushes.Black, 720, 75 + k * 25);
                                    e.Graphics.DrawString(this.listView1.Items[j].SubItems[4].Text.ToString(), font, Brushes.Black, 35, 75 + k * 25);
                                    k++;
                               }
                         }
                    }
            }

  • #2
    Hallo,

    beim Drucken musst Du mehrere Sachen beachten: Der PrintPage-EventHandler ist grundsätzlich zum Drucken einer einzelnen Seite zuständig. Wenn Du mehrere Seiten zu drucken hast, musst Du "irgendwo extern" einen Seitenzähler vorsehen (in Deinem Fall: ListView-Einträge 0 bis 19 auf Seite 1, 20 bis 39 auf Seite 2 usw.). Dieser Zähler dient innerhalb von PrintPage zur Abfrage, welche Daten konkret auf die aktuelle Seite zu drucken sind. Am Ende von PrintPage kommt die Prüfung auf weitere Seiten (in Abhängigkeit von dem zuletzt gedruckten ListView-Eintrag und den insgesamt vorhandenen Einträgen). Dies nutzt das Framework zur Prüfung, ob PrintPage erneut auszuführen ist.

    Zur Einführung siehe auch OpenBook Visual C# Kap.23

    Weitere Hinweise:

    "this" ist in aller Regel überflüssig.

    Die Umwandlung und Vergleichsprüfung über ToString() ist sehr oft Quatsch. Du willst die Datumswerte SelectionStart und SelectionEnd vergleichen; die Umwandlung als ShortDateString kostet nur Zeit, aber hilft nichts. Gleiches gilt bei der Prüfung der ListView-Gruppen.

    Erst recht ist Text.ToString() Blödsinn: Ein Text ist schon ein String; benutze ihn doch auch direkt.

    Analog gilt: listView1.Groups.Count ist schon ein int. Es ist also Quatsch, ihn per Convert in einen int zu konvertieren. Es würde Sinn machen, wenn Du die Anzahl als short (= Int16) benötigen würdest; aber Du vergleichst ihn mit dem int i, also wird sofort wieder ein int (= Int32) daraus - dreimal unnötig konvertiert! (Ich hoffe, dass der Compiler das rausschmeißt, aber warum willst Du ihm die Arbeit unbedingt erschweren?)

    Convert-Methoden sind sowieso möglichst zu vermeiden, vor allem wenn Du auf try-catch verzichtest. Diese führen im Fehlerfall zu einer Exception (was nicht nur lästig ist, sondern auch Zeit und Speicher kostet). Sofern vorhanden, sind die Methoden Parse, TryParse, TryParseExact vorzuziehen.

    Dringende Empfehlung: Achte genau auf die verwendeten Typen. Was gleich ist, kann und soll direkt verwendet werden.

    Jürgen

    Comment


    • #3
      Hallo,

      danke für die Antwort habs letztendlich auch hinbekommen.

      Danke auch für die weiteren Hinweise. Ich bin noch recht frisch in C# daher gehend ist mein Code noch wild und teilweise auch nicht immer sinnvoll.
      Darum sind solche Ratschläge immer gern genommen.

      so long

      Hasta

      Comment

      Working...
      X