Новое событие CustomCalc для объекта Report вызывается при вычислении выражения в объекте или при поступлении туда данных из источника данных. Таким образом мы можем использовать это событие для перехвата данных и их подмены. Когда это может быть полезно? Например, когда в поступаемых данных нужно отфильтровать значения или заменить какие-либо строки на другие.
Посмотрим на примере. Создаем простое приложение WindowsForms. Добавляем источник данных в проект. И компонент DataSet. Также, размещаем на форме компонент Report.
В выпадающем меню компонента Report выбираем Select Data Source:
И выбираем наш источник данных.
Теперь из этого же меню выбираем Design Report. Для демонстрации я добавил всего пару полей из таблицы Employee:
Для интереса посмотрим, как сейчас выглядит отчет:
Сохраняем отчет и закрываем дизайнер отчетов. Добавим на форму кнопку. И событие нажатия для нее:
1 2 3 4 5 6 7 8 9 10 11 |
private void Run_Click(object sender, EventArgs e) { report1.Load("D://Reports//Simple.frx"); report1.Prepare(); report1.ShowPrepared(); } |
Здесь все банально. Я загрузил созданный ранее отчет. Затем построил его и отобразил.
А теперь для объекта report1 добавим событие CustomCalc:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void report1_CustomCalc(object sender, FastReport.CustomCalcEventArgs e) { if (e.CalculatedObject.Equals("Roberto") ) { e.CalculatedObject = "Test Name"; } } |
Здесь мы перехватываем нужные нам данные и замещаем их. Все данные при построении проходят через объект CalculatedObject. Мы отлавливаем нужные нам данные “Roberto”. И заменяем их.
Можно замещать целиком поле данных. При этом, условие будет выглядеть так:
1 |
if (e.Expression.IndexOf("employee.FirstName") != -1)
|
Мы написали код для замещения данных прямо в обработчике события CustomCalc. Также можно присвоить обработчик события непосредственно из кода, например, в MVC приложении. В удобном месте в коде приложения пишем:
1 |
report1.CustomCalc += FReport_CustomCalc;
|
И сам обработчик:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private void FReport_CustomCalc(object sender, CustomCalcEventArgs e) { if (e.Expression.IndexOf("Employees.FirstName") != -1) { e.CalculatedObject = "Test Name"; } } |
Запускаем приложение. Нажимаем кнопку и видим наш отчет:
Давайте сравним этот скриншот с тем, что был сделан ранее. Как видим, первая запись и имя сотрудника Roberto попали под условие и была заменена на Test Name.
Таким образом, у нас появился способ замещать некоторые данные в отчете, что наверняка найдет свое применение у искушенных пользователей FastReport.