Иногда в вашей работе требуется один и тот же отчет, но с небольшими изменениями. Например, разные заголовки для разных отделов. Так, например, пользователь генератора отчетов ActiveReports хочет создать такой отчет:
For example, the user select copies for the customer and for administration department.
After, the application has to show the two pages in a form viewer.
Давайте реализуем такой отчет в FastReport.Net. Можно формировать один и тот же отчет и передавать в него разные параметры для заголовка. Но если вы хотите получить одинаковые отчеты с разными заголовками в одном отчете, можно поступить иначе. Мы можем дублировать страницы исходного отчета, а затем изменить заголовки в этих страницах. Проще всего будет показать на отчете с одной страницей.
В отчете будет параметр, в котором через запятую перечисляются номера заголовков, которые нужно выводить в этом отчете. В скрипте отчета мы дублируем страницу в зависимости от количества значений в параметре, потом заменим текст в заголовках новых страниц на нужный.
Таким образом мы можем формировать страницы с разными заголовками в зависимости от переданных номеров. Однако есть одна сложность. Придется вручную вычислять номер текстового объекта, в котором нужно заменить текст. К примеру, в моем отчете 9 текстовых объектов. Первый из них – заголовок. Значит десятый тоже будет заголовком, но на новой странице. Если к 10 прибавить еще 9, то получаем номер заголовка на третьей странице и так далее.
Вам станет понятнее, когда вы увидите скрипт:
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 29 30 31 32 33 34 35 36 37 38 39 |
private void _StartReport(object sender, EventArgs e) { //Parse parameter string parameter = (string)Report.GetParameterValue("Parameter"); string[] arr = parameter.Split(','); //Number of text obj that is header int step = 10; foreach (string item in arr) { ReportPage newPage = new ReportPage(); newPage.AssignAll(Page1); Report.Pages.Add(newPage); newPage.CreateUniqueName(); foreach (object obj in newPage.AllObjects) { if (obj is Base) { (obj as Base).CreateUniqueName(); } } TextObject txt = Report.FindObject("Text"+ step.ToString()) as TextObject; switch (item) { case "1": txt.Text = "Header 1"; break; case "2": txt.Text = "Header 2"; break; case "3": txt.Text = "Header 3"; break; } step = step + 9; } Report.Pages.Remove(Page1); } |
Разберем этот скрипт подробнее. Мы использовали событие StartReport у объекта Report. В обработчике события мы и будем осуществлять манипуляции со страницами отчета. Отчет уже имеет одну разработанную страницу – по сути это готовый «боевой» отчет, на базе которого мы хотим сделать несколько, но с разными заголовками.
Прежде всего парсим параметр отчета. Как уже говорилось ранее, в параметр передается последовательность идентификаторов шаблонов, которые мы хотим отобразить. Идентификаторы разделяются запятыми. Далее, в цикле перебираем полученные из параметра отчета идентификаторы. Для каждого из них создается страница на основе существующей, вычисляется текстовый объект с заголовком. В зависимости от идентификатора шаблона текстовому объекту заголовка задается значение. После того, как мы создали «пачку» нужных страниц, удаляем первую страницу-образец.
В итоге мы получаем несколько отчетов внутри одного. А управлять количеством этих отчетов-страниц можно передавая в отчет значение параметра - желаемую комбинацию идентификаторов, либо заголовков.