2016-05-31 6 views
0

Ich habe eine Haupt-PdfpTable mit einer Spalte, die ich als übergeordnete Tabelle verwenden. Ich füge dann Tabellen, die mit einer dynamischen Anzahl von Spalten erstellt wurden, zur übergeordneten Tabelle hinzu.PdfpTable verschachtelt in PdfpTable Zelle hat Leerzeichen auf beiden Seiten

Also jede Tabelle ist eine Zeile in der übergeordneten Tabelle. Ich bekomme, was ich abgesehen von ein paar Dingen wünschte:

1) Die Tabellen sind mit signifikanten Leerraum auf der linken und rechten Seite hinzugefügt; Ich möchte, dass die Untertabellen den Zeilenbereich füllen.

2) Spaltenbreiten halten nicht. Die erste Spalte jeder neuen Tabelle ändert die Breite basierend auf der Anzahl der insgesamt vorhandenen Spalten.

3), um die Haupttischbreite betroffen scheint nicht von der .TotalWidth

Einstellung
PdfPTable mainTable = new PdfPTable(1); 
    mainTable.TotalWidth = 1000f; 

     //Iterating through some data, get the count then create tables. 
     PdfPTable subTable = new PdfPTable(colCount); 

//I tried setting the widths to fix issue 2 
    float[] colWidths = new float[colCount]; 
         colWidths[0] = 50f; 
         for (int i = 1; i < colCount; i++) 
         { 
          colWidths[i] = 50f; 
         } 
         subTable.SetWidths(colWidths); 

     PdfPCell cell = new PdfPCell(); 
           cell.AddElement("test"); 
           subTable.AddCell(cell); 

     PdfPCell tblCell = new PdfPCell(); 
          //tblCell.Padding = 0f; 
          //tblCell.PaddingLeft = 0f; 
          //tblCell.PaddingRight = 0f; 
          tblCell.AddElement(subTable); 
          mainTable.AddCell(tblCell); 

habe ich versucht, für jede Spalte, die Breiten einstellen, entfernen Klotzen, und setzen die Gesamtbreiten sowohl für die Mutter und Untertabellen, aber mit gemischten Ergebnissen.

+0

Ich habe keine Zeit für eine vollständige Antwort, aber ein Punkt der Verwirrung ist, dass 'SetWidths()' setzt die _relative_ Breite von Spalten.Also, wenn Sie "50, 100" passieren, werden Sie nicht 50 Einheiten und 100 Einheiten überschreiten, sondern sagen, dass die erste Spalte ein Drittel (50/(50 + 100)) und die zweite zwei Drittel (100/(50 + 100)) '. Stattdessen möchten Sie wahrscheinlich 'SetTotalWidth (float [])' zusammen mit 'LockedWidth' –

Antwort

0

Es gibt verschiedene Möglichkeiten, Tabellen zu verschachteln, jeder Ansatz hat sein eigenes spezifisches Verhalten. Ich habe dies im NestedTables6 Beispiel demonstriert:

Zuerst haben wir die Haupttabelle zu erstellen:

PdfPTable mainTable = new PdfPTable(1); 
mainTable.setTotalWidth(1000); 
mainTable.setLockedWidth(true); 

Da wir eine Gesamtbreite definieren, müssen wir auch die Breite sperren. Mein Code ist in Java, aber es ist sehr einfach, den Code an C# anzupassen. Es ist so etwas wie mainTable.LockedWidth = true; (Ich bin nicht so gut in C#, also müssen Sie mir vergeben, wenn meine C# nicht ganz korrekt ist).

Die einfachste Möglichkeit zum Verschachteln einer Tabelle besteht darin, die Tabelle einfach mit addCell() hinzuzufügen. Allerdings: In diesem Fall wird das Standard-Padding verwendet, was bedeutet, dass Sie den Standard-Padding auf 0 setzen müssen. In C#, das wäre so etwas wie: mainTable.DefaultCell.Padding = 0; in Java, es so gemacht wird:

mainTable.getDefaultCell().setPadding(0); 
PdfPTable subTable1 = new PdfPTable(5); 
subTable1.setTotalWidth(new float[]{200, 200, 200, 100, 300}); 
subTable1.setLockedWidth(true); 
subTable1.addCell("test 1"); 
subTable1.addCell("test 2"); 
subTable1.addCell("test 3"); 
subTable1.addCell("test 4"); 
subTable1.addCell("test 5"); 
mainTable.addCell(subTable1); 

Ein zweiter Weg zum Nest eine Tabelle, ist ein PdfPCell mit der Tabelle als Parameter zu erstellen. In diesem Fall lautet die Standardauffüllung 0.

PdfPTable subTable2 = new PdfPTable(5); 
subTable2.setTotalWidth(new float[]{200, 100, 200, 200, 300}); 
subTable2.setLockedWidth(true); 
subTable2.addCell("test 1"); 
subTable2.addCell("test 2"); 
subTable2.addCell("test 3"); 
subTable2.addCell("test 4"); 
subTable2.addCell("test 5"); 
PdfPCell cell2 = new PdfPCell(subTable2); 
mainTable.addCell(cell2); 

Sie verwenden die Methode AddElement(). Das funktioniert auch, aber Sie müssen die Polsterung 0 einzustellen:

PdfPTable subTable3 = new PdfPTable(5); 
subTable3.setTotalWidth(new float[]{200, 200, 100, 200, 300}); 
subTable3.setLockedWidth(true); 
subTable3.addCell("test 1"); 
subTable3.addCell("test 2"); 
subTable3.addCell("test 3"); 
subTable3.addCell("test 4"); 
subTable3.addCell("test 5"); 
PdfPCell cell3 = new PdfPCell(); 
cell3.setPadding(0); 
cell3.addElement(subTable3); 
mainTable.addCell(cell3); 

Bitte beachte, dass ich die Gesamtbreite der Tabelle als 1000 definiert, und dass ich darauf geachtet, dass die Summe aller Spaltenbreiten der Teiltabellen war identisch mit 1000. Ich habe auch die setTotalWidths() Methode verwendet, weil ich absolute Werte übergebe (während Sie relative Werte übergeben).

Das Endergebnis sieht wie folgt aus: cmp_nested_tables6.pdf

enter image description here

Wie Sie sehen können, gibt es keinen Leerraum auf beiden Seiten.

+0

großes Beispiel verwenden, danke. Ich werde das ausprobieren und ein Update machen. – JWiley

Verwandte Themen