Search code examples
c#printdocument

Printing Multiple Pages in a Winform application


I am attempting to print something using a C# Winforms application. I can't seem to understand how multiple pages works. Let's say I have the following code in my constructor:

private string _stringToPrint;
_stringToPrint = "";
for (int i = 0; i < 120; i++)
{
    _stringToPrint = _stringToPrint + "Line " + i.ToString() + Environment.NewLine;
}

Then I have this code on my button click event:

private void MnuFilePrintClick(object sender, EventArgs e)
{
    var pd = new PrintDocument();
    pd.PrintPage += pd_PrintPage;

    var z = new PrintPreviewDialog { Document = pd };

    z.ShowDialog(this);
}

void pd_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics g = e.Graphics;
    var font = new Font("Arial", 10f, FontStyle.Regular);

    g.DrawString(_stringToPrint, font, Brushes.Black, new PointF(10f, 10f));
}

Right now, when I run this code, it is giving me one page and after like 70 lines, it just runs off the paper. How would I print this string so that it prints enough for one page, then runs over to the second page, etc..?


Solution

  • You could have a counter and set the amount of lines you want per page like so:

    private string[] _stringToPrint = new string[100]; // 100 is the amount of lines
    private int counter = 0;
    private int amtleft = _stringToPrint.Length;
    private int amtperpage = 40; // The amount of lines per page
    for (int i = 0; i < 120; i++)
    {
        _stringToPrint[i] ="Line " + i.ToString();
    }
    

    Then in pd_PrintPage:

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        int currentamt = (amtleft > 40)?40:amtleft;
        Graphics g = e.Graphics;
        var font = new Font("Arial", 10f, FontStyle.Regular);
        for(int x = counter; x < (currentamt+counter); x++)
        {
            g.DrawString(_stringToPrint[x], font, Brushes.Black, new PointF(10f, (float)x*10));
            // x*10 is just so the lines are printed downwards and not on top of each other
            // For example Line 2 would be printed below Line 1 etc
        }
        counter+=currentamt;
        amtleft-=currentamt;
        if(amtleft<0)
            e.HasMorePages = true;
        else
            e.HasMorePages = false;
        // If e.HasMorePages is set to true and the 'PrintPage' has finished, it will print another page, else it wont
    }
    

    I have had bad experiences with e.HasMorePages so this may not work.

    Let me know if this works and I hope it helps!