Erinnern wir uns an eine ziemlich häufige Situation, in der Sie etwas sehr schnell und buchstäblich „auf den Knien“ tun müssen. Wir dürfen jedoch nicht vergessen, dass die Struktur und der Inhalt eines Berichts von externen Faktoren abhängen. Der FastReport.NET-Berichtsgenerator ist ein sehr flexibles Produkt und bietet Ihnen zwei Möglichkeiten, dieses Problem zu lösen.
Methode 1. Erstellen einer Berichtsstruktur im Code der Benutzeranwendung.
Methode 2. Interne Steuerung des Berichtsverhaltens mithilfe eines Skripts.
Es gibt ziemlich viele Informationen darüber, wie man bestimmte Verhaltensmerkmale in ein Berichtsskript implementiert. Es gibt jedoch nur wenige Beispiele dafür, wie man einen Bericht aus dem Code erstellen kann. In diesem Artikel werden wir also einen Bericht mit einer Tabelle aus dem Anwendungscode erstellen und beleuchten, wie man die Tabelle mit Daten füllt und ein Objekt in einer Tabellenzelle platziert. Die Methode 2 wird in einem anderen Artikel ausführlicher behandelt.
Das Objekt Tabelle (Table) kann mit statischen oder dynamischen Daten gefüllt werden. Im ersten Fall kennen wir die spezifischen Abmessungen der Tabelle und tragen die Daten sofort aus einem festen Satz in die Zellen ein.
Im zweiten Fall wird die Tabelle dynamisch aufgebaut, Zeilen (Spalten) werden je nach den Daten in der Quelle hinzugefügt. Sie können jedoch auch die Größe der Tabelle begrenzen und fixieren.
Lassen Sie uns eine WinForms-Anwendung erstellen. Aktivieren Sie in den Links die FastReport.dll-Bibliothek, die Sie im Ordner mit dem installierten Berichtsgenerator finden. Fügen Sie dem Formular eine Schaltfläche hinzu, über die der Bericht erstellt wird. Und vergessen Sie nicht, einen Click-Handler dafür zu erstellen.
Aktivieren Sie zunächst die FastReport-Bibliotheken.
using FastReport; using FastReport.Data; using FastReport.Table; using FastReport.Utils; private void button1_Click(object sender, EventArgs e) { using (Report report = new Report()) //Erstellen eines Berichtsobjekts { ReportPage page = new ReportPage(); //Erstellen eines Berichtsseitenobjekts page.Name = "Page1"; //Festlegen des Seitennamens report.Pages.Add(page); //Hinzufügen einer Seite zur Berichtsseitensammlung DataSet ds = new DataSet(); //Erstellen einer Datenquelle ds.ReadXml("~/../../../App_Data/nwind.xml"); //Laden der xml-Datenbank hinein report.RegisterData(ds); //Registrieren der Datenquelle im Bericht report.GetDataSource("Products").Enabled = true; //Einschalten der Datenquelle DataBand dataBand = new DataBand(); //Erstellen eines Datenbandes dataBand.Name = "DataBand"; //Festlegen des Band-Namens page.Bands.Add(dataBand); //Hinzufügen eines Bands zur Bandsammlung der Seite TableObject table = new TableObject(); //Erstellen des Tabellenobjekts table.Name = "Table1"; //Festlegen des Objektnamens table.RowCount = 10; // Festlegen der Zeilenanzahl table.ColumnCount = 2; //Festlegen der Spaltenanzahl //Füllen aller Zellen im Zyklus mit einigen Daten for (int i = 0; i < 10; i++) for (int j = 0; j < 2; j++) { table[j, i].Text = (10 * i + j + 1).ToString(); table[j, i].Border.Lines = BorderLines.All; } dataBand.Objects.Add(table); //dataBand.Objects.Add(picture); if (report.Prepare()) report.ShowPrepared(); }
Betrachten wir nun den Fall, dass die Tabelle mit Daten aus einer Quelle gefüllt werden muss. Ersetzen Sie den obigen Zyklus durch anderen Code:
table.Columns[0].AutoSize = true; //table.Columns[1].AutoSize = true; DataSourceBase data = report.GetDataSource("Products"); data.Init(); //Initialisieren der Datenquelle data.First(); //Der erste resultierende Datensatz for (int i = 0; i < 10; i++) { table[0, i].Text = data["ProductName"].ToString(); table[0, i].Border.Lines = BorderLines.All; //Festlegen der Rahmen table[1, i].Text = data["UnitPrice"].ToString(); table[1, i].Border.Lines = BorderLines.All; data.Next(); }
Als Ergebnis erhalten wir eine Tabelle mit Daten aus der Datenbank:
Ohne Kopfzeile sieht die Tabelle unvollständig aus. Fügen wir sie hinzu:
table.RowCount = 11; … table[0, 0].Text ="Product Name"; table[0, 0].Border.Lines = BorderLines.All; table[1, 0].Text = "Unit Price"; table[1, 0].Border.Lines = BorderLines.All; for (int i = 1; i < 10; i++) { table[0, i].Text = data["ProductName"].ToString(); table[0, i].Border.Lines = BorderLines.All; table[1, i].Text = data["UnitPrice"].ToString(); table[1, i].Border.Lines = BorderLines.All; data.Next(); }
Zur Verdeutlichung: In der ersten Zeile der Tabelle haben wir die Kopfzeilen festgelegt, so dass der Zyklus nicht mit dem ersten, sondern mit dem zweiten Element beginnt.
Betrachten wir den letzten Fall für heute und zwar, wie man ein Objekt, zum Beispiel ein Bild in eine Tabellenzelle einfügt:
PictureObject picture = new PictureObject(); //Erstellen des Bildobjekts picture.Bounds = new RectangleF(40, 0, Units.Centimeters * 0.5f, Units.Centimeters * 0.5f);
//Festlegen der Objektgröße picture.CreateUniqueName(); //Festlegen eines beliebigen Namens picture.Image = Image.FromFile("C:/Users/FR/Downloads/28.png"); //Festlegen des Pfads zum Bild picture.LoadImage(); //Hochladen eines Bildes picture.Parent = table[1, 1]; //Festlegen des übergeordneten Objekts für das Bild
Es ist die Eigenschaft Parent, die sich auf die Anzeige des Bildes in der Zelle auswirkt. Werfen wir einen Blick darauf, wie es aussehen wird:
Wir haben also beleuchtet, wie man eine Tabelle in einem Bericht aus dem Anwendungscode erstellt und welche zwei Möglichkeiten es gibt, sie mit statischen und dynamischen Daten zu füllen. Außerdem kennen Sie jetzt die Möglichkeiten, ein Objekt programmgesteuert zu einer Tabellenzelle hinzuzufügen.