Несмотря на то, что «арсенал» встроенных функций в дизайнере отчетов отнюдь не мал, иногда все же не хватает какой-то специфической. Благодаря наличию скрипта в отчете мы легко можем реализовать нужную функцию. Но что, если эта функция на нужна во многих отчетах? Каждый раз добавлять ее в скрипт отчета? Конечно же нет. Мы можем использовать собрать все любимые функции в библиотеку подключить ее к дизайнеру отчетов.
Желательно, чтобы библиотека размещалась в одной папке с отчетом.
Давайте создадим Class Library проект, в котором будет наша тестовая функция. К примеру – функция преобразования массива в строку. Получился такой класс.
1 2 3 4 5 6 7 8 9 10 |
namespace ArrayToString { public static class UserDefined { public static string ArrayToString(List<string> parameters) { return String.Join(",", parameters); } } } |
Компилируем библиотеку.
Теперь создадим свое приложение, в котором вызовем генератор отчетов и воспользуемся нашей библиотекой ArrayToString. Это обычное Winforms Application. Добавляем библиотеку FastReport в ссылки проекта. Так как рекомендуется хранить вашу библиотеку в одной папке с исполняемым файлом вашего приложения, то можно добавить ссылку на нее в проект. При этом библиотека будет добавлена в папку с исполняемым файлом при компиляции.
В приложении только форма и кнопка. Для кнопки добавим обработчик события нажатия:
1 2 3 4 5 |
private void RunBtn_Click(object sender, EventArgs e) { Report report = new Report(); report.Design(); } |
Запустим приложение и нажмем кнопку. При этом запустится дизайнер отчетов с пустым отчетом. В свойствах отчета, вы можете добавить ссылку на вашу .net библиотеку.
Теперь создадим простенький шаблон отчета – список категорий товаров:
В бэнд Page Footer добавляем текстовый объект. Скоро вы узнаете зачем он.
Перейдем на вкладку Script. Нам нужно создать список, в который мы будем добавлять названия категорий. Функция из пользовательской библиотеки преобразует список в одну строку, которую мы отобразим в подвале страницы.
Итак, создаем список:
1 2 3 4 |
public class ReportScript { public List<string> list = new List<string>(); } |
Вернемся к странице отчета. Для бэнда Data создадим обработчик события AfterPrint:
1 2 3 4 |
private void Data1_AfterPrint(object sender, EventArgs e) { list.Add(((String)Report.GetColumnValue("Categories.CategoryName"))); } |
Здесь мы добавляем имя категории каждый раз после отображения бэнда «Данные».
Теперь, добавим обработчик события BeforePrint для текстового объекта в подвале страницы:
1 2 3 4 |
private void Text1_BeforePrint(object sender, EventArgs e) { Text1.Text = ArrayToString.UserDefined.ArrayToString(list); } |
Здесь, мы присваиваем текстовому объекту строку, возвращаемую пользовательской функцией из добавленной ранее dll-ки. Обратите внимание, что путь к функции полный, с указанием неймспейса и имени класса. Можно сократить имя, если добавить библиотеку ArrayToString в using.
Теперь можно запустить отчет в режиме предварительного просмотра.
Верх страницы:
И низ страницы:
Таким образом, мы получили список категорий товаров в одной строке.
Кстати, вы можете использовать в текстовом объекте в подвале страницы выражение: [ArrayToString.UserDefined.ArrayToString(list)]
Оно абсолютно равнозначно этому:
1 2 3 4 |
private void Text1_BeforePrint(object sender, EventArgs e) { Text1.Text = ArrayToString.UserDefined.ArrayToString(list); } |
И не нужно создавать обработчик события.
Если вы хотите использовать пользовательскую библиотеку для отчетов в веб проекте, то нужно разместить ее в папке bin.