iTextSharp仅显示某些DataGridView列

时间:2014-07-10 23:07:16

标签: c# datagridview itextsharp

我想使用iTextSharp在PDF文件中仅显示某些DataGridView列。我知道你可以将整个GridView插入到PDF文档中。但是,是否可以仅显示DataGridView的某些列?

到目前为止,这是我的代码:

        iTextSharp.text.Font fontTable = FontFactory.GetFont("Arial", 8, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);

        PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);
        table.SpacingBefore = 45f;
        table.TotalWidth = 300;
        table.DefaultCell.Phrase = new Phrase() { Font = fontTable };

        for (int j = 0; j < dataGridView1.Columns.Count; j++)
        {
            table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText, fontTable));

        }

        table.HeaderRows = 1;

        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            for (int k = 0; k < dataGridView1.Columns.Count; k++)
            {
                if (dataGridView1[k, i].Value != null)
                {
                    table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString(),fontTable));
                }
            }
        }



        doc.Add(table);

1 个答案:

答案 0 :(得分:0)

我面前没有IDE,所以这可能无法完美编译,但您只需要在for语句中编写一些任意条件。这段代码直接从我链接的页面中提取,我刚刚添加了一些if语句来检查列的名称并跳过这些。

foreach (DataGridViewColumn c in GridView.Columns)
{
    if( c.Name == "Something" )
    {
        //Skip this column
        continue;
    }

    //process these columns
    //..
}

for (int i = 0; i < GridView.Rows.Count - 1; i++)
{
    for (int j = 0; j < GridView.Columns.Count - 1; j++)
    {
        if( GridView.Columns[j].Name == "Something" )
        {
            //Skip this column
            continue
        }

        //Process these columns
    }
}

修改

根据您当前的代码和上述内容,您需要以下内容:

iTextSharp.text.Font fontTable = FontFactory.GetFont("Arial", 8, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);

PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);
table.SpacingBefore = 45f;
table.TotalWidth = 300;
table.DefaultCell.Phrase = new Phrase() { Font = fontTable };

for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
    if(dataGridView1.Columns[j].Name == "Something")
    {
        continue;
    }
    table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText, fontTable));

}

table.HeaderRows = 1;

for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    for (int k = 0; k < dataGridView1.Columns.Count; k++)
    {
        if(dataGridView1.Columns[k].Name == "Something")
        {
            continue;
        }
        if (dataGridView1[k, i].Value != null)
        {
            table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString(),fontTable));
        }
    }
}
doc.Add(table);

而不是Name您可能需要使用ID或仅使用jk的实际索引,这真的取决于您如何设置你的DGV。

您还希望在内部for循环中略微更改逻辑。您正在检查null,但仍需要添加单元格,否则整个表格可能会移位。

if (dataGridView1[k, i].Value != null)
{
    table.AddCell(new Phrase(dataGridView1[k, i].Value.ToString(),fontTable));
}
else
{
    table.AddCell(new Phrase(""));
}

您需要做的另一项更改是实际PdfPTable的实例化。而不是:

PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);

你会想做类似的事情:

PdfPTable table = new PdfPTable(dataGridView1.Columns.Count - 2); //Subtract the number of columns that you are hiding