C# 使用foreach将单元格垂直添加到表中

C# 使用foreach将单元格垂直添加到表中,c#,asp.net,itext,C#,Asp.net,Itext,将单元格添加到表中时,它将添加到下一列 有没有办法先添加行或更灵活地添加值?我是一个初学者,所以对此我不太了解 这是我的代码: Document document = new Document(PageSize.A3, 50, 50, 25, 25); MemoryStream PDFData = new MemoryStream(); PdfWriter PDFWriter = PdfWriter.GetInstance(document, PDFData); document.Open();

将单元格添加到表中时,它将添加到下一列

有没有办法先添加行或更灵活地添加值?我是一个初学者,所以对此我不太了解

这是我的代码:

Document document = new Document(PageSize.A3, 50, 50, 25, 25);
MemoryStream PDFData = new MemoryStream();
PdfWriter PDFWriter = PdfWriter.GetInstance(document, PDFData);
document.Open();

PdfPTable table = new PdfPTable(testTimes);
table.DefaultCell.Border = 1;
table.HorizontalAlignment = 0;

table.WidthPercentage = 100f;

foreach (Test test in tests)
{
    switch (test.type)
    {
        case 3:
            //new Column (fail)
            PdfPCell type = new PdfPCell(new Phrase(TestType.Aimatologikes.ToString()));
            table.AddCell(type);

            PdfPCell data = new PdfPCell(new Phrase("values"));
            foreach (TestData testdata in test.TestDatas)
            {
                //Rows
                table.AddCell(data);
            }

            break;
    }
}

document.Add(table);
document.Close();
结果是:

我想把第二个foreach下面的列分开。这可能吗?

有两个建议:

  • 首先,更新代码以使用iText 7(如果可能)。如果您正在启动一个新项目,那么使用最新版本的API是有意义的
  • 其次,(正如@mkl所建议的那样)编写一个中介数据结构,作为表对象的逻辑视图
请允许我解释一下。
让我们称这个中间对象为EasyTable

EasyTable需要做几件事:

  • 允许您在给定坐标处设置特定的PdfObject
  • 在给定坐标处更改PdfObject
  • 计算行数
  • 计算列数
  • 提供一种方便的方法,以逐行方式获取所有单元格(包括可能的空白)

要做到这一点,您可以轻松实现易于使用的地图。这样可以将点对象映射到PdfObject。您可以通过迭代所有键并找到最大Y值来计算行数。列数类似。

什么是
测试
?它不能用现有函数导入到
PdfPTable
中吗?@VDWWD它是使用linq的IEnumerable im。我不知道如何导入它我也不知道如何导入。但是如果它是一个列表,您可以
Count()
其中的项目并创建必要的行。常规的iText API使用只允许逐行添加单元格。有些人滥用API将
PdfPRow
实例添加到表中(iText期望只在内部完成的事情);这样做,您可以以任何喜欢的方式准备(即用单元格填充)这些行对象,但iText开发人员不赞成这样做。我建议预先创建所有单元格,并对它们进行排序,以允许按预期的行方式添加它们。