FastReport .NET bietet zahlreiche Möglichkeiten für den Datenzugriff und die Datenverarbeitung, darunter Datenbanken, DataSet, JSON sowie Business Objects (gewöhnliche C#-Klassen in Ihrer Anwendung).
In diesem Artikel wird anhand eines praxisnahen Beispiels gezeigt, wie Sie eine .frx-Berichtsvorlage erstellen und verwenden, die mit hierarchischen Business Objects (Kategorie → Produkte) arbeitet.
Business Objects bieten gegenüber herkömmlichen Datenquellen eine Reihe von Vorteilen:
Installieren Sie zunächst das NuGet-Paket FastReport.Net.Demo (oder die lizenzierte Version von FastReport.Net von unserem privaten NuGet-Server). Erstellen Sie anschließend die folgenden Modellklassen:
public class Category { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public List<Product> Products { get; set; } = new List<Product>(); public Category() { } public Category(string name, string description) { Name = name; Description = description; } } public class Product { public string Name { get; set; } = string.Empty; public decimal UnitPrice { get; set; } public Product() { } public Product(string name, decimal unitPrice) { Name = name; UnitPrice = unitPrice; } }
Implementieren Sie anschließend eine einfache Methode zum Befüllen der Business Objects mit Beispieldaten:
static private void CreateBusinessObject() { FBusinessObject.Clear(); Category category = new Category("Beverages", "Soft drinks, coffees, teas, beers"); category.Products.Add(new Product("Chai", 18m)); category.Products.Add(new Product("Chang", 19m)); category.Products.Add(new Product("Ipoh coffee", 46m)); FBusinessObject.Add(category); category = new Category("Confections", "Desserts, candies, and sweet breads"); category.Products.Add(new Product("Chocolade", 12.75m)); category.Products.Add(new Product("Scottish Longbreads", 12.5m)); category.Products.Add(new Product("Tarte au sucre", 49.3m)); FBusinessObject.Add(category); category = new Category("Seafood", "Seaweed and fish"); category.Products.Add(new Product("Boston Crab Meat", 18.4m)); category.Products.Add(new Product("Red caviar", 15m)); FBusinessObject.Add(category); }
Um einen Bericht auf Grundlage der Datenquelle Categories BusinessObject zu erstellen, verwenden Sie den folgenden Code:
[STAThread] static void Main(string[] args) { Report report = new Report(); CreateBusinessObject(); report.RegisterData(FBusinessObject, "Categories BusinessObject"); report.Design(); }
Wichtig: Rufen Sie RegisterData nach dem Laden des Berichts (report.Load) und vor dem Aufruf von report.Prepare() auf.
Nach dem Start des Report-Designers wählen Sie die Datenquelle über "Data → Choose Report Data".
Erstellen Sie nun einen einfachen Master-Detail-Bericht oder verwenden Sie eine der Beispielvorlagen, die in den FastReport-Demoprojekten enthalten sind.
Sobald der Bericht erstellt wurde, können Sie ihn im Vorschaumodus (Preview) ausführen, um das Ergebnis zu überprüfen.
Nachdem die Berichtsvorlage erstellt wurde, können Sie sie mit dem folgenden Code in einer Konsolenanwendung anzeigen:
[STAThread] static void Main(string[] args) { Report report = new Report(); report.Load(@"Business Objects.frx"); CreateBusinessObject(); report.RegisterData(FBusinessObject, "Categories BusinessObject"); report.Prepare(); report.Show(); report.Dispose(); }
public partial class Form1 : Form { static private List<Category> FBusinessObject = new List<Category>(); public Form1() { InitializeComponent(); CreateBusinessObject(); } private void CreateBusinessObject() { FBusinessObject.Clear(); Category category = new Category("Beverages", "Soft drinks, coffees, teas, beers"); category.Products.Add(new Product("Chai", 18m)); category.Products.Add(new Product("Chang", 19m)); category.Products.Add(new Product("Ipoh coffee", 46m)); FBusinessObject.Add(category); category = new Category("Confections", "Desserts, candies, and sweet breads"); category.Products.Add(new Product("Chocolade", 12.75m)); category.Products.Add(new Product("Scottish Longbreads", 12.5m)); category.Products.Add(new Product("Tarte au sucre", 49.3m)); FBusinessObject.Add(category); category = new Category("Seafood", "Seaweed and fish"); category.Products.Add(new Product("Boston Crab Meat", 18.4m)); category.Products.Add(new Product("Red caviar", 15m)); FBusinessObject.Add(category); } private void btnCreateNew_Click(object sender, EventArgs e) { // create report instance Report report = new Report(); // register the business object report.RegisterData(FBusinessObject, "Categories BusinessObject"); // design the report report.Design(); // free resources used by report report.Dispose(); } private void btnRunExisting_Click(object sender, EventArgs e) { // create report instance Report report = new Report(); // load the existing report report.Load(@"..\..\Business Objects.frx"); // register the business object report.RegisterData(FBusinessObject, "Categories BusinessObject"); // run the report report.Show(); // free resources used by report report.Dispose(); } } public class Category { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public List<Product> Products { get; set; } = new List<Product>(); public Category() { } public Category(string name, string description) { Name = name; Description = description; } } public class Product { public string Name { get; set; } = string.Empty; public decimal UnitPrice { get; set; } public Product() { } public Product(string name, decimal unitPrice) { Name = name; UnitPrice = unitPrice; } }
Business Objects sind eine der modernsten und komfortabelsten Möglichkeiten, mit Daten in FastReport .NET zu arbeiten. Sie ermöglichen es, die Berichtserstellung sauber und wartbar in die Architektur Ihrer Anwendung zu integrieren, ohne unnötige Komplexität in die Codebasis einzubringen.
Dieser Ansatz eignet sich besonders für mittelgroße und große Projekte, in denen eine klare Trennung der Verantwortlichkeiten, Wartbarkeit und eine schnelle Entwicklung von Berichten entscheidend sind.
Durch die Verwendung von Business Objects erhalten Sie maximale Flexibilität und volle Kontrolle darüber, wie Daten in Ihre Berichte gelangen, während Ihre Reporting-Schicht eng mit dem Domänenmodell Ihrer Anwendung verbunden bleibt.