指数超出范围。从gridview数据提供打印时,必须是非负数且小于collection.error的大小。 [英] Index was out of range. Must be non-negative and less than the size of the collection.error while giving print from gridview data.

查看:80
本文介绍了指数超出范围。从gridview数据提供打印时,必须是非负数且小于collection.error的大小。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,



从Gridview数据打印时,我的索引超出了范围错误。



这是我的代码,任何人都可以告诉我我的代码有什么问题吗?



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?

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:

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();
    }
}





我在printdocument控制方法下编写的代码:





Code which I've written under printdocument control method:

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);
    }
}

推荐答案

我认为这里可能会出现问题:

Hi, I presume the issue could occur here:
//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++;
}



更具体地说,您从ArrayLists中检索项目的代码:


To be more specific, the code in which you are retrieving an item from your ArrayLists:

new RectangleF((int)arrColumnLefts[iCount],

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

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



在那里放置断点并调查这些变量, ArrayLists可能没有任何项目吗?


Put breakpoints there and investigate these variables, is it possible that the ArrayLists do not have any item?


这篇关于指数超出范围。从gridview数据提供打印时,必须是非负数且小于collection.error的大小。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆