954,510 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Printing on more than one page

Hi, i'm having a problem trying to print out a list of strings. i can get them to print out using rectangles successfully but when the bottom of the page is reached it wont go onto the next page, instead it just stops printing.

I've done this so far which just repeats the first page over and over rather than just printing the rest of the text on a new page:

private void document_PrintPage(object sender, PrintPageEventArgs e)
        {
            List<string> propNames = new List<string>();
            List<string> propValue = new List<string>();

            Font titleFont = new Font("Arial", 22, System.Drawing.FontStyle.Regular);
            string title = "Object State Default";

            RectangleF rect = new RectangleF();
            rect.X = 50.0F;
            rect.Y = 30.0F;
            rect.Width = 300.0F;
            rect.Height = 50.0F;
            SolidBrush brush = new SolidBrush(Color.Black);
            Pen blackpen = new Pen(Color.Transparent);            
            Font printFont = new Font("Arial", 11, System.Drawing.FontStyle.Regular);
            //Gets names of all properties
            propNames = printObject(objtyp);
            //Gets values of all properties
            propValue = getPrintValues();
            //Draws title of the page
            e.Graphics.DrawString(title, titleFont, brush, rect);
            //Sets position for next rectangle
            rect.Y = rect.Y + 75;

            for (int i = 0; i < propNames.Count && i < propValue.Count; i++)
            {
                e.Graphics.DrawString(propNames.ElementAt(i), printFont, brush, rect);
                rect.X = rect.X + 300;
                e.Graphics.DrawString(propValue.ElementAt(i), printFont, brush, rect);
                rect.Y = rect.Y + 30;
                   
                if (rect.Y >= 1100)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }
            }            
        }


Any help with this would be great !

Thanks

Chris

ChrisHunter
Posting Whiz in Training
276 posts since Feb 2011
Reputation Points: 36
Solved Threads: 28
 

1. Put the code that does the printing into a seperate method that returns a bool (True = there are more pages to print)
2. Change document_PrintPage to call it, setting e.HasMorePages to the result

private void document_PrintPage(object sender, PrintPageEventArgs e)
{
e.HasMorePages = DoPrint(e.Graphics);
}

        private bool DoPrint(Graphics g)
        {
            List<string> propNames = new List<string>();
            List<string> propValue = new List<string>();

            Font titleFont = new Font("Arial", 22, System.Drawing.FontStyle.Regular);
            string title = "Object State Default";

            RectangleF rect = new RectangleF();
            rect.X = 50.0F;
            rect.Y = 30.0F;
            rect.Width = 300.0F;
            rect.Height = 50.0F;
            SolidBrush brush = new SolidBrush(Color.Black);
            Pen blackpen = new Pen(Color.Transparent);
            Font printFont = new Font("Arial", 11, System.Drawing.FontStyle.Regular);
            //Gets names of all properties
            propNames = printObject(objtyp);
            //Gets values of all properties
            propValue = getPrintValues();
            //Draws title of the page
            g.DrawString(title, titleFont, brush, rect);
            //Sets position for next rectangle
            rect.Y = rect.Y + 75;
            int i = lastIndex;
            //i = lastIndex;
            while (i < propValue.Count)
            {

                //e.Graphics.DrawRectangle(blackpen, x, y, width, height);
                g.DrawString(propNames.ElementAt(i), printFont, brush, rect);
                rect.X = rect.X + 300;
                g.DrawString(propValue.ElementAt(i), printFont, brush, rect);
                rect.X = 50.0F;
                rect.Y = rect.Y + 30;
                //&& i < propNames.Count && i < propValue.Count
                if (rect.Y >= 1130)
                {
                    lastIndex = i;
                    return true;
                    //rect.Y = 40.0F;
                }
                //else
                //{
                //    return false;
                //}
                i++;
            }
            return false;
        }
KirstyHunter
Newbie Poster
7 posts since Mar 2011
Reputation Points: 11
Solved Threads: 1
 

Thank you this worked perfectly

ChrisHunter
Posting Whiz in Training
276 posts since Feb 2011
Reputation Points: 36
Solved Threads: 28
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: