Click here to Skip to main content
15,897,518 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hi Everyone,

I'm getting Index was out of range error while taking print from Gridview data.

Here is my code can anyone tell me what's wrong with my code?

C#
public partial class Form1 : Form
{
    #region Member Variables
    StringFormat strFormat; //Used to format the grid rows.
    ArrayList arrColumnLefts = new ArrayList();//Used to save left coordinates of columns
    ArrayList arrColumnWidths = new ArrayList();//Used to save column widths
    int iCellHeight = 0; //Used to get/set the datagridview cell height
    int iTotalWidth = 0; //
    int iRow = 0;//Used as counter
    bool bFirstPage = false; //Used to check whether we are printing first page
    bool bNewPage = false;// Used to check whether we are printing a new page
    int iHeaderHeight = 0; //Used for the header height
    #endregion


Code Which I've written under Print button method:

C#
private void btnprint_Click(object sender, EventArgs e)
{
    //Open the print dialog
    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument1;
    printDialog.UseEXDialog = true;
    //Get the document
    if (DialogResult.OK == printDialog.ShowDialog())
    {
        printDocument1.DocumentName = "Test Page Print";
        printDocument1.Print();
    }
}


Code which I've written under printdocument control method:

C#
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    try
    {
        //Set the left margin
        int iLeftMargin = e.MarginBounds.Left;
        //Set the top margin
        int iTopMargin = e.MarginBounds.Top;
        //Whether more pages have to print or not
        bool bMorePagesToPrint = false;
        int iTmpWidth = 0;

        //For the first page to print set the cell width and header height
        if (bFirstPage)
        {
            foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
            {
                iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
                (double)iTotalWidth * (double)iTotalWidth *
                ((double)e.MarginBounds.Width / (double)iTotalWidth))));

                iHeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText,
                GridCol.InheritedStyle.Font, iTmpWidth).Height) + 11;

                // Save width and height of headers
                arrColumnLefts.Add(iLeftMargin);
                arrColumnWidths.Add(iTmpWidth);
                iLeftMargin += iTmpWidth;
            }
        }
        //Loop till all the grid rows not get printed
        while (iRow <= dataGridView1.Rows.Count - 1)
        {
            DataGridViewRow GridRow = dataGridView1.Rows[iRow];
            //Set the cell height
            iCellHeight = GridRow.Height + 5;
            int iCount = 0;
            //Check whether the current page settings allows more rows to print
            if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
            {
                bNewPage = true;
                bFirstPage = false;
                bMorePagesToPrint = true;
                break;
            }
            else
            {
                if (bNewPage)
                {
                    //Draw Header
                    e.Graphics.DrawString("Customer Summary",
                    new Font(dataGridView1.Font, FontStyle.Bold),
                    Brushes.Black, e.MarginBounds.Left,
                    e.MarginBounds.Top - e.Graphics.MeasureString("Customer Summary",
                    new Font(dataGridView1.Font, FontStyle.Bold),
                    e.MarginBounds.Width).Height - 13);

                    String strDate = DateTime.Now.ToLongDateString() + " " +
                    DateTime.Now.ToShortTimeString();
                    //Draw Date
                    e.Graphics.DrawString(strDate,
                    new Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black,
                    e.MarginBounds.Left +
                    (e.MarginBounds.Width - e.Graphics.MeasureString(strDate,
                    new Font(dataGridView1.Font, FontStyle.Bold),
                    e.MarginBounds.Width).Width),
                    e.MarginBounds.Top - e.Graphics.MeasureString("Customer Summary",
                    new Font(new Font(dataGridView1.Font, FontStyle.Bold),
                    FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                    //Draw Columns 
                    iTopMargin = e.MarginBounds.Top;
                    foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
                    {
                        e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
                        new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                        (int)arrColumnWidths[iCount], iHeaderHeight));

                        e.Graphics.DrawRectangle(Pens.Black,
                        new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                        (int)arrColumnWidths[iCount], iHeaderHeight));

                        e.Graphics.DrawString(GridCol.HeaderText,
                        GridCol.InheritedStyle.Font,
                        new SolidBrush(GridCol.InheritedStyle.ForeColor),
                        new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
                        (int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
                        iCount++;
                    }
                    bNewPage = false;
                    iTopMargin += iHeaderHeight;
                }
                iCount = 0;
                //Draw Columns Contents 
                foreach (DataGridViewCell Cel in GridRow.Cells)
                {
                    if (Cel.Value != null)
                    {
                        e.Graphics.DrawString(Cel.Value.ToString(),
                        Cel.InheritedStyle.Font,
                        new SolidBrush(Cel.InheritedStyle.ForeColor),
                        new RectangleF((int)arrColumnLefts[iCount],
                        (float)iTopMargin,
                        (int)arrColumnWidths[iCount], (float)iCellHeight),
                        strFormat);
                    }
                    //Drawing Cells Borders 
                    e.Graphics.DrawRectangle(Pens.Black,
                    new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                    (int)arrColumnWidths[iCount], iCellHeight));
                    iCount++;
                }
            }
            iRow++;
            iTopMargin += iCellHeight;
        }
        //If more lines exist, print another page.
        if (bMorePagesToPrint)
            e.HasMorePages = true;
        else
            e.HasMorePages = false;
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK,
        MessageBoxIcon.Error);
    }
}
Posted
Updated 13-Mar-15 21:43pm
v2
Comments
George Jonsson 14-Mar-15 5:15am    
Where exactly does the error occur?
If you use 'exc.ToString()' instead of 'exc.Message' you will see the whole stack trace including the line where the error was thrown.
Then you can always debug your code step-by-step and see where it goes wrong.
The debugger is actually not a dangerous animal and it doesn't bite you.

1 solution

Hi, I presume the issue could occur here:
C#
//Draw Columns Contents 
foreach (DataGridViewCell Cel in GridRow.Cells)
{
    if (Cel.Value != null)
    {
        e.Graphics.DrawString(Cel.Value.ToString(),
        Cel.InheritedStyle.Font,
        new SolidBrush(Cel.InheritedStyle.ForeColor),
        new RectangleF((int)arrColumnLefts[iCount],
        (float)iTopMargin,
        (int)arrColumnWidths[iCount], (float)iCellHeight),
        strFormat);
    }
    //Drawing Cells Borders 
    e.Graphics.DrawRectangle(Pens.Black,
    new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
    (int)arrColumnWidths[iCount], iCellHeight));
    iCount++;
}

To be more specific, the code in which you are retrieving an item from your ArrayLists:
C#
new RectangleF((int)arrColumnLefts[iCount],

new Rectangle((int)arrColumnLefts[iCount], iTopMargin,

(int)arrColumnWidths[iCount], iCellHeight));

Put breakpoints there and investigate these variables, is it possible that the ArrayLists do not have any item?
 
Share this answer
 
Comments
shaliniraji 16-Mar-15 3:30am    
Hi,
I put the breakpoints and dubugged the code.I'm getting the error on the same line which you have mentioned above..
Mario Z 16-Mar-15 4:11am    
Hi, well then the problem definitely occurs because these ArrayLists are empty:

ArrayList arrColumnLefts = new ArrayList();//Used to save left coordinates of columns
ArrayList arrColumnWidths = new ArrayList();//Used to save column widths

You need to put some numerical values into them.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900