Большинство современных генераторов отчетов позволяют использовать практические любые базы данных. Однако, мало какой генератор может работать со списками или массивами объектов в качестве источника данных. В этой статье я покажу как это делается на примере генератора отчетов FastReport .Net.
Отмечу некоторые важные моменты:
Создадим приложение WindowsForms.
Передадим в отчет список категорий. Для каждой категории будет добавлен список продуктов.
Объявляем переменные:
1 2 |
private List<Category> FBusinessObject; private Report FReport; |
Из названий понятно, что это: список категорий и объект отчета.
Итак, добавим класс продуктов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Product { private string FName; private decimal FUnitPrice; public string Name { get { return FName; } } public decimal UnitPrice { get { return FUnitPrice; } } public Product(string name, decimal unitPrice) { FName = name; FUnitPrice = unitPrice; } } |
Как видим, поля объекта объявлены как public.
Теперь добавим класс категорий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class Category { private string FName; private string FDescription; private List<Product> FProducts; public string Name { get { return FName; } } public string Description { get { return FDescription; } } public List<Product> Products { get { return FProducts; } } public Category(string name, string description) { FName = name; FDescription = description; FProducts = new List<Product>(); } } |
Одно из полей объекта Category – список продуктов. То есть список категорий представляет собой массив массивов.
Переходим к созданию источника данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public void CreateDataSource() { FBusinessObject = new List<Category>(); //Create list of categories Category category = new Category("Beverages", "Soft drinks, coffees, teas, beers"); //Create new instance of category category.Products.Add(new Product("Chai", 18m)); //Add new product to category category.Products.Add(new Product("Chang", 19m)); category.Products.Add(new Product("Ipoh coffee", 46m)); FBusinessObject.Add(category); //Add the category to the List 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); } |
Из комментариев понятно, что создается список объектов Category. Затем создается новая категория и в нее добавляется нужное количество продуктов. После этого добавляем категорию в список категорий. Таким образом мы добавляем несколько категорий с продуктами.
Мы создали источник данных. Теперь его нужно зарегистрировать в отчете с помощью метода RegisterData:
1 2 3 4 |
public void RegisterData() { FReport.RegisterData(FBusinessObject, "Categories"); } |
Этот метод сделает наш список доступным в отчете под именем: “Categories”.
Добавим метод запуска отчета в дизайнере:
1 2 3 4 5 6 7 |
public void DesignReport() { FReport = new Report(); CreateDataSource(); RegisterData(); FReport.Design(); } |
Здесь мы создали экземпляр объекта отчета, создали источник данных, зарегистрировали его и открыли отчет в дизайнере.
Добавляем на форму кнопку вызова метода дизайнера отчетов:
1 2 3 4 |
public void button1_Click(object sender, EventArgs e) { DesignReport(); } |
В дизайнере отчетов необходимо выбрать источник данных в меню Data -> Choose Report Data…
Создаем простой отчет типа Master-Detail:
И запускаем отчет в режиме предварительного просмотра:
Подведем итоги. FastReport .Net еще раз доказал, что это гибкий, современный продукт. Вы можете использовать нужные данные из своего приложения, не заботясь о преобразовании их в DataTable.