2014-10-29 3 views
3

следующий код создает таблицу и вложенную таблицу. Однако вложенная таблица всегда выровнена по середине. Я не знаю, как правильно добиться горизонтального выравнивания.Невозможно выровнять по левому краю вложенные таблицы внутри ячейки

Следующий метод просто перебирает список. , когда это простой вопрос, я добавлю TextField. Если это вопрос, содержащий несколько ответов, я буду вводить вложенную таблицу с помощью флажков и значений.

private PdfPTable CreateQuestionTable(RLQuestionRecordList questions) 
    { 
     PdfPCell cell; 
     PdfPTable table = new PdfPTable(2); 
     //table.SetWidths(new int[]{ 50, 50 }); 
     table.WidthPercentage = 100; 
     table.SpacingBefore = 20; 
     table.SpacingAfter = 20; 
     table.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT; 
     foreach (RCQuestionRecord q in questions) 
     { 
      //add question to the table 
      cell = new PdfPCell(new Phrase(q.ssSTQuestion.ssName, _Normal)); 
      cell.Border = Rectangle.NO_BORDER; 
      cell.Padding = 5.0f; 
      table.AddCell(cell); 

      //add answer to the table. 
      //add generate time we don;t know where the table will be, 
      //hence textfields will be generated after the pdf has been generated.. 

      if (q.ssSTQuestion.ssListOfAnswers.Length > 0) 
      { 
       // we have radiobuttons, so we add a table inside the cell 
       cell = new PdfPCell(); 
       cell.Border = Rectangle.NO_BORDER; 
       cell.Padding = 5.0f; 
       //we cannot align the table to the left in the cell for some weird reason... 
       cell.HorizontalAlignment = Element.ALIGN_LEFT; 
       cell.AddElement(CreateCheckboxTable(q)); 
       table.AddCell(cell); 
      } 
      else 
      { 
       // we have simple textfield, so add that to the cell 
       cell = new PdfPCell(); 
       cell.Border = Rectangle.NO_BORDER; 
       cell.Padding = 5.0f; 
       cell.HorizontalAlignment = Element.ALIGN_LEFT; 
       //simple textfield 
       cell.CellEvent = new OOMTextField(string.Format("question_{0}", q.ssSTQuestion.ssQuestionId), q.ssSTQuestion.ssLength, q.ssSTQuestion.ssValue, bf); 
       table.AddCell(cell); 
      } 
     } 
     return table; 
    } 

Это вложенная таблица, которую я хочу вставить в ячейку выше.

/// <summary> 
    /// 
    /// </summary> 
    /// <param name="question"></param> 
    /// <returns></returns> 
    private PdfPTable CreateCheckboxTable(RCQuestionRecord question) 
    { 
     PdfPCell cell; 
     int numCells = question.ssSTQuestion.ssListOfAnswers.Length; 

     PdfPTable table = new PdfPTable(numCells); 
     float[] widths = new float[numCells]; 

     int currentColumn = 0; 
     //table.SetWidths(new int[]{ 50, 50 }); 
     foreach (RCAnswerRecord a in question.ssSTQuestion.ssListOfAnswers) { 
      //checkbox 
      cell = new PdfPCell(new Phrase(a.ssSTAnswer.ssLabel, _Normal)); 
      cell.Border = Rectangle.NO_BORDER; 
      cell.Padding = 0.0f; 
      cell.PaddingLeft = 20.0f; 
      cell.HorizontalAlignment = Element.ALIGN_LEFT; 
      cell.VerticalAlignment = Element.ALIGN_CENTER; 
      cell.CellEvent = new OOMCheckBox(string.Format("question_{0}", question.ssSTQuestion.ssQuestionId), a.ssSTAnswer.ssIsSelected, a.ssSTAnswer.ssLabel, bf); 
      //checkbox 
      table.AddCell(cell); 
      widths[currentColumn++] = 20.0f + bf.GetWidthPoint(a.ssSTAnswer.ssLabel, 11); 
     } 

     table.SetTotalWidth(widths); 
     table.LockedWidth = true; 
     table.SpacingBefore = 0; 
     return table; 
    } 

Что мне не хватает, чтобы выровнять вложенные таблицы полностью влево внутри ячейки?

ответ

6

Пожалуйста, обратите внимание на PDF документ под названием nested_tables_aligned.pdf:

enter image description here

Внешняя таблица в данном примере имеет три столбца и одну строку. Каждая ячейка в этой внешней таблице содержит внутреннюю таблицу. Первый внутренний стол выравнивается влево, второй выравнивается по центру, третий выравнивается по правому краю.

Этот PDF был создан на примере Java с именем NestedTablesAligned:

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(PageSize.A4.rotate()); 
    PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    float[] columnWidths = {200f, 200f, 200f}; 
    PdfPTable table = new PdfPTable(columnWidths); 
    table.setTotalWidth(600f); 
    table.setLockedWidth(true); 
    buildNestedTables(table); 
    document.add(table); 
    document.close(); 
} 

private void buildNestedTables(PdfPTable outerTable) { 
    PdfPTable innerTable1 = new PdfPTable(1); 
    innerTable1.setTotalWidth(100f); 
    innerTable1.setLockedWidth(true); 
    innerTable1.setHorizontalAlignment(Element.ALIGN_LEFT); 
    innerTable1.addCell("Cell 1"); 
    innerTable1.addCell("Cell 2"); 
    outerTable.addCell(innerTable1); 
    PdfPTable innerTable2 = new PdfPTable(2); 
    innerTable2.setTotalWidth(100f); 
    innerTable2.setLockedWidth(true); 
    innerTable2.setHorizontalAlignment(Element.ALIGN_CENTER); 
    innerTable2.addCell("Cell 3"); 
    innerTable2.addCell("Cell 4"); 
    outerTable.addCell(innerTable2); 
    PdfPTable innerTable3 = new PdfPTable(2); 
    innerTable3.setTotalWidth(100f); 
    innerTable3.setLockedWidth(true); 
    innerTable3.setHorizontalAlignment(Element.ALIGN_RIGHT); 
    innerTable3.addCell("Cell 5"); 
    innerTable3.addCell("Cell 6"); 
    outerTable.addCell(innerTable3); 

}

Как вы можете видеть, я задать выравнивание таблицы на уровне таблицы, а не на уровне клетки. Принцип выборки применяется к iTextSharp. В примере C# вы определяете выравнивание для PdfPCell вместо PdfPTable. Измените это, и ваша проблема будет решена.

+0

Awesome, спасибо! – Mafti

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