Entwickler-Ecke

WinForms - Mehrere Seiten drucken (print more pages)


Rock O´Brian - Di 14.04.20 10:02
Titel: Mehrere Seiten drucken (print more pages)
Hallo zusammen,
ich habe eine Frage:

ich arbeite mit VisualStudio 2019, WindowsForm, C#

eine Textbox beinhaltet 6 DIN A4 Seiten Text, die ich zuerst auf Bildschirm, dann auf Laserdrucker ausdrucken möchte, mit PreviewDialog
ich habe es bisher nur geschafft, die erste Seite auf Bildschirm und auf Laserdrucker zu drucken, aber wie geht es wenn mehrere Seiten zu drucken sind ?

dieser Code funktioniert nur auf Bildschirm, auf Drucker gibt es nur ein weißes Blatt, warum ?

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace EHP_Bauprogramm_V4._5.Menu
{
    public partial class Inhaltsverzeichnis : Form
    {
        public Inhaltsverzeichnis()
        {
            InitializeComponent();
        }

        private void AbbrechenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        int line = 0;
        private void PrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //e.Graphics.DrawString("Inhaltsverzeichnis", new Font("Times New Roman", 12, FontStyle.Bold), Brushes.Black, new Point(50, 50));
            //e.Graphics.DrawString(Tbx_Suchwort.Text, new Font("Times New Roman", 10, FontStyle.Regular), Brushes.Black, new Point(50, 110));
            
            {
                e.HasMorePages = false;
                Font f = new Font("Arial"10, FontStyle.Regular);
                int currentHeight = 0;
                for (;line <Tbx_Suchwort.Lines.Count();line +=1)
                {
                    e.Graphics.DrawString(Tbx_Suchwort.Lines [line], f, Brushes.Black, 50, currentHeight+115);
                    currentHeight += f.Height;
                    if (currentHeight >= e.PageBounds.Height - 230)
                    {
                        e.HasMorePages = true;
                        break;
                    }
                }                
            }
        }

        private void DruckenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.Document = printDocument1;
            if (printPreviewDialog1.ShowDialog() == DialogResult.OK)
            {
                printDocument1.Print();
            }
        }
    }
}

Bitte kann mir jemand auf einfache Weise einen Code sagen, der mehr als eine Seite Text druckt ?

Vielen Dank

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert (deutschen Text hinzugefügt).


Th69 - Di 14.04.20 12:12

Hallo und :welcome:,

du solltest line vor jedem Druck wieder auf 0 zurücksetzen (da sonst die Schleife niemals mehr durchlaufen wird): dafür gibt es das PrintDocument.BeginPrint [https://docs.microsoft.com/de-de/dotnet/api/system.drawing.printing.printdocument.beginprint]-Ereignis.
Generell sollte dein Code mit HasMorePage aber so funktionieren - prüfe doch mal mit dem Debugger, ob die Abfrage passend ausgeführt wird.

PS: GDI-Objekte (wie z.B. Font) müssen wieder per Dispose() (oder besser noch mittels der using (...)-Anweisung) freigegeben werden.


Rock O´Brian - Di 14.04.20 12:52

Vielen Dank für den Tipp

da ich "blutiger Anfänger" bin, (ich habe diesen Code aus Youtube einfach abgetippt) habe ich keine Ahnung, wo ich "line auf Null" setzen muss.

Bitte, bitte kannst du mir deine Verbesserungen in meinen Code einfügen ?

vielen Dank

Moderiert von user profile iconTh69: Beiträge zusammengefasst

und wo kann ich dir ein "Dankeschön" anklicken ?


Th69 - Di 14.04.20 12:59

Ich habe dir mal Beispielcode rausgesucht: Provide printing and print previews with advanced features for Windows Forms applications in C# [http://csharphelper.com/blog/2014/08/provide-printing-and-print-previews-with-advanced-features-for-windows-forms-applications-in-c/] (du mußt dann nur, so wie du es auch für die PrintPage-Methode gemacht hast, diese Ereignismethode im Designer abonnieren (= zuweisen)).

PS: Bei jedem Beitrag gibt es den "thx"-Button zum Anklicken.