2014-02-19 3 views
0

У меня есть простая настройка класса для создания PDF-файла из datatable. Я передаю datatable в код, который имеет 16 строк, но цикл, который проходит через каждый datarow, останавливается после строки 9 по какой-то причине, и я не могу сказать почему. Счет отлично, но он просто останавливается.iTextSharp не записывает все строки из datatable

Это код:

public class CreatePDF 
    { 
     static public string GetPDF(DataTable dt) 
     { 
      Document document = new Document(); 
      Random rnd = new Random(); 
      String randomnumber = Convert.ToString(rnd.Next(300)); 
      string FileName = "PDF" + randomnumber + ".pdf"; 
      String FilePath = "C:\\TFS\\Portal\\Uploads\\" + FileName; 


      iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new FileStream(FilePath, FileMode.Create)); 
      document.Open(); 
      iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.HELVETICA, 5); 

      iTextSharp.text.pdf.PdfPTable table = new iTextSharp.text.pdf.PdfPTable(dt.Columns.Count); 
      iTextSharp.text.pdf.PdfPRow Row = null; 
      float[] widths = new float[] { 4f, 4f, 4f, 4f }; 

      //table.SetWidths(widths); 

      table.WidthPercentage = 100; 
      iTextSharp.text.pdf.PdfPCell cell = new iTextSharp.text.pdf.PdfPCell(new Phrase("Products")); 

      cell.Colspan = dt.Columns.Count; 

      foreach (DataColumn c in dt.Columns) 
      { 

       table.AddCell(new Phrase(c.ColumnName, font5)); 
      } 

      foreach (DataRow r in dt.Rows) 
      { 
       if (dt.Rows.Count > 0) 
       { 
        table.AddCell(new Phrase(r[0].ToString(), font5)); 
        table.AddCell(new Phrase(r[1].ToString(), font5)); 
        table.AddCell(new Phrase(r[2].ToString(), font5)); 
        table.AddCell(new Phrase(r[3].ToString(), font5)); 
       } 
      } 
      document.Add(table); 
      document.Close(); 


      if (!File.Exists(FilePath)) 
       throw new FileNotFoundException(
         string.Format("Final PDF file '{0}' was not found on disk.", 
            FilePath)); 
      var fi = new FileInfo(FilePath); 
      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.AddHeader("Content-Disposition", 
          String.Format("attachment; filename=\"{0}\"", 
             FileName)); 
      HttpContext.Current.Response.AddHeader("Content-Length", fi.Length.ToString()); 
      HttpContext.Current.Response.ContentType = "application/octet-stream"; 
      HttpContext.Current.Response.WriteFile(fi.FullName); 

     return "a"; 
     } 



    } 
+0

При запуске через отладчик, делает dt.Rows.Count равным 16? – u84six

+0

Да, но я только что понял проблему, добавлю ее ниже. – connersz

ответ

1

Эта проблема в том, что он не настраивал определение столбца правильно. Мне пришлось создать дополнительный код, чтобы удостовериться, что он устанавливает правильное количество столбцов для этой таблицы и проходит по каждой строке.

Я изменил это:

foreach (DataRow r in dt.Rows) 
    { 
     if (dt.Rows.Count > 0) 
     { 
      table.AddCell(new Phrase(r[0].ToString(), font5)); 
      table.AddCell(new Phrase(r[1].ToString(), font5)); 
      table.AddCell(new Phrase(r[2].ToString(), font5)); 
      table.AddCell(new Phrase(r[3].ToString(), font5)); 
     } 
    } 

Для этого:

foreach (DataRow r in dt.Rows) 
    { 
     if (dt.Rows.Count > 0) 
     { 
      int index = -1; 
      foreach (DataColumn dc in dt.Columns) 
      { 
       index++; 
       if (index != dt.Rows.Count) 
       { 
       table.AddCell(new Phrase(r[index].ToString(), font5)); 
       } 

      } 
     } 
    } 
Смежные вопросы