C# iTextSharp和datagridview分页符

C# iTextSharp和datagridview分页符,c#,itext,C#,Itext,我正在尝试使用iTextSharp将datagrid导出为PDF,并且需要在一列更改时进行分页符。我有这个密码 using (FileStream stream = new FileStream(savefiledialoge.FileName, FileMode.Create)) { try { pdfdoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f); PdfWriter writer = Pd

我正在尝试使用iTextSharp将datagrid导出为PDF,并且需要在一列更改时进行分页符。我有这个密码

using (FileStream stream = new FileStream(savefiledialoge.FileName, FileMode.Create))
{
    try
    {
        pdfdoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
        PdfWriter writer = PdfWriter.GetInstance(pdfdoc, stream);
        pdfdoc.SetPageSize(PageSize.A4.Rotate()); // horizontal
        pdfdoc.Open();
        Encabezado();
        for (int i = 0; i <= dataGridView1.RowCount; i++)
        {
            for (int j = 0; j < dataGridView1.Columns.Count; j++)
            {
                if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() == dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
                {                                     
                    pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
                }
                else
                {
                    pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
                    pdfdoc.Add(pdftable);                                                                                
                    pdfdoc.NewPage();
                    pdftable.DeleteBodyRows();                                        
                }                                    
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "error occured ", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

您在循环中的列上有大小写区分:

for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
    if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() == dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
    {
        pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
    }
    else
    {
        pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
        pdfdoc.Add(pdftable);
        pdfdoc.NewPage();
        pdftable.DeleteBodyRows();
    }
}
关于“指数超出范围”:

  • 一方面,如果您已经在最后一行,请不要将仓库与下一行的值进行比较,请参见上文
  • 另一方面,正如@Bruno已经提到的,循环
    i
    应该提前停止,而不是停止

    for (int i = 0; i <= dataGridView1.RowCount; i++) 
    

    对于(int i=0;我确信
    (int i=0;i@PhilippMaurer)来说,只是部分重复,超出范围的问题只是问题的一小部分。
    
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
        pdftable.AddCell(new Phrase(dataGridView1.Rows[i].Cells[j].Value.ToString(), text));
    }
    
    if (i == dataGridView1.RowCount - 1)
    {
        pdfdoc.Add(pdftable);
    }
    else if (dataGridView1.Rows[i].Cells["Warehouse"].Value.ToString() != dataGridView1.Rows[i + 1].Cells["Warehouse"].Value.ToString())
    {
        pdfdoc.Add(pdftable);
        pdfdoc.NewPage();
        pdftable.DeleteBodyRows();
    }
    
    for (int i = 0; i <= dataGridView1.RowCount; i++) 
    
    for (int i = 0; i < dataGridView1.RowCount; i++)