Laden...

Wie portiere ich ein TableLayoutPanel in eine PDF-Datei?

Erstellt von athavan94 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.667 Views
A
athavan94 Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren
Wie portiere ich ein TableLayoutPanel in eine PDF-Datei?

Ich habe momentan ein Projekt und komme bei einer Funktion nicht weiter. Es soll den gesamten Inhalt von TableLayoutPanel in eine PDF exportieren.
Im Moment funktioniert es nur mit DataGridView.

Dieser Code wäre die Funktion die Daten von DataGriedView in eine PDF Datei exportiert.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;



private void button4_Click(object sender, EventArgs e)
        {
            //Pfad auswählen
            saveFileDialog1.InitialDirectory = "C:";
            saveFileDialog1.Filter = "PDF Datei | *.pdf";
            saveFileDialog1.ShowDialog();

            try
            {

                //Estellt ein Dokument mit angegebenen Seitenabständen
                Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);

                //PDF Datei mit Dateiname wird erstellt
                PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(saveFileDialog1.FileName, FileMode.Create));

                //Dokument wird geöffnet
                doc.Open();
                PdfPTable table = new PdfPTable(dataGridView1.Columns.Count);

                //Die Kopfzeile in die Tabele hinzufügen
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    table.AddCell(new Phrase(dataGridView1.Columns[j].HeaderText));
                }

                //Erste Zeile als Kopfzeile setzen
                table.HeaderRows = 1;

                //Die Daten einfüllen von DataGridView in die Tabele
                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()));
                        }
                    }
                }

                //Die Tabele freigeben
                doc.Add(table);

                //Dokument schliessen
                doc.Close();

                //Meldung wenn Datei erstellt wurde
                MessageBox.Show("PDF wurde erstellt!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                //Meldung wenn Datei nicht erstellt wurde
                MessageBox.Show("PDF wurde nicht erstellt!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

16.807 Beiträge seit 2008
vor 7 Jahren

Was einem auffällt:

Ansonsten solltest Du potentiellen Helfern nicht nur sagen, dass es nicht geht, sondern was genau hier nicht geht. Du schreibst mit keinem Wort, was Dein aktuelles Problem denn ist.
Siehe [Hinweis] Wie poste ich richtig? Punkt 5
Keiner kann an dem Code erkennen, was Dein eigentliches Problem ist - und Hellsehen kann hier niemand 😉

A
athavan94 Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

Dieser Code funktioniert. Es dient nur als Gedankenstütze oder als Beispiel...Mein eigentliches Problem ist ich brauche einen Code der TableLayoutPanel in PDF exportiert. Ich bin noch ein anfänger ^^

H
523 Beiträge seit 2008
vor 7 Jahren

Du musst alle Controls in dem TableLayoutPanel durchlaufen, die Koordinaten der einzelnen Controls auslesen, in eine geordnete Form (sortiert nach row & column) bringen und dann das ganze in das PDF übertragen (genauso wie Du es mit dem GridView machst).

So kannst Du alle Controls in dem TableLayoutPanel durchlaufen und die Koordinaten ermitteln:


foreach (Control ctl in this.tableLayoutPanel1.Controls)
{
       TableLayoutPanelCellPosition coord = this.tableLayoutPanel1.GetCellPosition(ctl);
}

H
523 Beiträge seit 2008
vor 7 Jahren

Hallo athavan94,

hier die Antwort auf Deine Frage per PN.
So kannst Du jede Zelle des TableLayoutPanels durchlaufen:


            TableLayoutPanel pnl = new TableLayoutPanel();
            for (int zeile = 0; zeile < pnl.RowCount; zeile++)
            {
                for (int spalte = 0; spalte < pnl.ColumnCount; spalte++)
                {
                    Control ctl = pnl.GetControlFromPosition(spalte, zeile);
                }
            }

Gruß hypersurf

A
athavan94 Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

Verstehe und table.AddCell hat du da auch eine Ahnung wie ich das machen könnte?
Danke

H
523 Beiträge seit 2008
vor 7 Jahren

Nein, da Du uns bisher nicht verraten hast was für Controls in dem TableLayoutPanel enthalten sind 😉

A
athavan94 Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

Es sind nur panels drin im tableLayoutPanel. Die werden nach dem Klicken eines Buttons einer nach dem anderen rot.

4.931 Beiträge seit 2008
vor 7 Jahren

Hallo,

was genau möchtest du denn von den Panels übernehmen? Nur die Hintergrundfarbe als Rechteck in die PDF-Tabelle?
Schau dir mal TextSharp - Introducing Tables an - dort wird auf PdfPCell verwiesen.
Um dann die Hintergrundfarbe zu setzen: itext color for cell data

Ein bißchen mehr Eigeninitiative (bzw. mehr Infos) deinerseits solltest du dir aber angewöhnen.