Многостраничный однообразный отчёт: наиболее оптимальный способ
Всем доброе время суток!
Я пишу на C#, используя WinForms. Изучаю FastReport 1.1.27, являюсь начинающим. Но по документации уже научился составлять простые отчёты, используя параметры. Так же научился получать в коде и динамически добавлять строки в объект FastReport.Table.TableObject. Но недавно появилась новая задача и как справиться с ней, пока я не очень себе представляю. Точнее, представляю, но, боюсь, это будет слишком нерационально и есть какой-то специально предусмотренный механизм.
Ситуация: имеется список(List) работников(имя, фамилия, список детей). Необходимо сгенерировать отчёт, состоящий из нескольких страниц, каждая из которых должна содержать имя, фамилию + таблицу с детьми по каждому работнику.
Мои действия(наполнение таблиц я описанным методом уже производил, а реализация многостраничности отчёта - это только предположение):
- В дизайнере создаю страницу, на ней два текстовых поля для имени и фамилии.
- Добавляю параметры в отчёт: имя и фамилия, затем их же прописываю в текстовых полях.
- Создаю шапку таблицы для детей.
- В коде приложения, в обработчике события OnPrint() перед тем, как показать отчёт, в цикле для каждого работника создаю в объекте отчёта копию приготовленной в дизайне страницы, передаю туда параметры(имя, фамилия), затем получаю FastReport.Table.TableObject и в цикле для каждого ребёнка инициализирую и добавляю объекты FastReport.Table.TableRow.
- Вызываю метод Show() отчёта.
Вопрос: являются ли мои действия правильными? Это касается как создания страниц отчёта по каждому работнику, так и наполнения таблиц с именами детей. Мне, почему-то, кажется, что для этого предусмотрены какие-то специальные методы вроде:
- для наполнения таблиц: передача в отчёт целого списка, к примеру, List<Children> и последующего биндинга полей класса Children к столбцам таблицы. Т.е. отчёт сам занимается заполнением строк таблицы в цикле.
- для создания отдельных страниц: что-то вроде наполнения таблиц...
Если такие методы существуют, очень прошу, ткните пожалуйста в соответствующие разделы документаций! Сам я пока что нашёл лишь то, что могу из кода установить в отчёт в качестве DataSource - объект IEnumerable, т.е. свой список. А, вот, как дальше - не пойму...
Очень надеюсь на вашу помощь, заранее спасибо!
Я пишу на C#, используя WinForms. Изучаю FastReport 1.1.27, являюсь начинающим. Но по документации уже научился составлять простые отчёты, используя параметры. Так же научился получать в коде и динамически добавлять строки в объект FastReport.Table.TableObject. Но недавно появилась новая задача и как справиться с ней, пока я не очень себе представляю. Точнее, представляю, но, боюсь, это будет слишком нерационально и есть какой-то специально предусмотренный механизм.
Ситуация: имеется список(List) работников(имя, фамилия, список детей). Необходимо сгенерировать отчёт, состоящий из нескольких страниц, каждая из которых должна содержать имя, фамилию + таблицу с детьми по каждому работнику.
Мои действия(наполнение таблиц я описанным методом уже производил, а реализация многостраничности отчёта - это только предположение):
- В дизайнере создаю страницу, на ней два текстовых поля для имени и фамилии.
- Добавляю параметры в отчёт: имя и фамилия, затем их же прописываю в текстовых полях.
- Создаю шапку таблицы для детей.
- В коде приложения, в обработчике события OnPrint() перед тем, как показать отчёт, в цикле для каждого работника создаю в объекте отчёта копию приготовленной в дизайне страницы, передаю туда параметры(имя, фамилия), затем получаю FastReport.Table.TableObject и в цикле для каждого ребёнка инициализирую и добавляю объекты FastReport.Table.TableRow.
- Вызываю метод Show() отчёта.
Вопрос: являются ли мои действия правильными? Это касается как создания страниц отчёта по каждому работнику, так и наполнения таблиц с именами детей. Мне, почему-то, кажется, что для этого предусмотрены какие-то специальные методы вроде:
- для наполнения таблиц: передача в отчёт целого списка, к примеру, List<Children> и последующего биндинга полей класса Children к столбцам таблицы. Т.е. отчёт сам занимается заполнением строк таблицы в цикле.
- для создания отдельных страниц: что-то вроде наполнения таблиц...
Если такие методы существуют, очень прошу, ткните пожалуйста в соответствующие разделы документаций! Сам я пока что нашёл лишь то, что могу из кода установить в отчёт в качестве DataSource - объект IEnumerable, т.е. свой список. А, вот, как дальше - не пойму...
Очень надеюсь на вашу помощь, заранее спасибо!
Комментарии
Посмотрите отчет "Features/Business Objects" - master-detail список категорий и продуктов, из источника типа IEnumerable. Чтобы вывести каждую категорию на отдельном листе, щелкните правой кнопкой мыши на бэнде Data1 и выберите пункт "Формировать новую страницу".
Дело в том, что при попытке добавить новый источник данных в дизайнере, у меня открываются параметры для подключения к БД и ни намёка на то, что я могу добавить IEnumerable. Как это(RegisterData() и управление бизнес-объектом в дизайнере) связать?
Но, ведь, бэнды - это сугубо "горизонтальное" понятие? А если нужны столбцы? Как их создать без таблицы? (я, скорее всего, чего-то просто ещё не знаю, но очень хочу узнать )
Столбцы бывают разные
Если нужно печатать на странице в несколько колонок - это одно (в настройках страницы ставите количество колонок и все). Если нужна развертка отчета по вертикали - тогда да, таблица делалась именно для этого. Посмотрите еще объект "Матрица" (если структура Ваших данных позволяет его использовать).
Там у меня пусто. А бизнес-объект я устанавливаю в методе-обработчике события "Показать отчёт". Т.е. файл отчёта ".frx" я создаю в дизайнере(прикрепил пример). Затем, уже во время работы программы, когда пользователь жмёт кнопку "Отчёт", я заполняю этот отчёт данными и вызываю метод Show(). Так вот я не пойму, как увязать вызовы из кода и работу в дизайнере? Изменения в дизаянере я вижу в коде, но не наоброт! Или, может, я не там изменения делаю?
Поставил 3. На странице отчёта появилась серая область. А как управлять колонками почему-то не понял. Ладно, это я разберусь... Мне было бы интересно узнать, обычно для моей задачи какие средства используют? Т.е. самый распространённый и оптимальный вариант? Бизнес-объекты и таблицы? Или нет? И какой метод соединения программных и отображаемых данных? В коде или в дизайнере? И какая часть в коде, а какая в дизайнере? Как-то у меня всё смешалось и чувствую, что какой-то детали просто не знаю, а когда узнаю, всё встанет на свои места Был бы Вам очень признателен за пояснения...
И ещё вопрос: было бы любопытно посмотреть на код подготовки отчёта в примере демки "Features/Business Objects". Это возможно? А то я виду только то, что к отчёту подключены данные в виде бизнес-объекта. А как они используются в коде - не знаю...
Про колонки читаем здесь:
http://fast-report.com/documentation/UserM...withcolumns.htm
Исходник Demo.exe берем здесь:
C:\Program Files\FastReports\FastReport.Net Demo\Demos\C#\Main
Т.е. Вы имеете в виду, что "тот сценарий работы, ради которого создавался FastReport" - это давать возможность конечному пользователю запускать дизайнер и править файл отчёта с целью выбрать, какие данные показывать, а затем открывать отчёт?
Спасибо, премного благодарен. Уже смотрю...
Вы спрашиваете, как получить такой файл. Надо зарегистрировать источник (RegisterData), вызвать дизайнер, отметить источник в меню "Данные/Выбрать данные для отчета..." и сохранить файл.
1) В дизайн-тайме Visual Studio. Кладете на форму компонент BindingSource и привязываете его к своему объекту. Далее кладете компонент Report и выбираете в качестве источника - bindingSource1. Этого достаточно для создания нормального отчета. Единственный минус - в дизайн-тайме Вы работаете без "живых" данных, т.е. просмотреть отчет не получится.
2) В работающем приложении. Делаете примерно так, как в Demo.exe. Несомненный плюс - есть живые данные. Я всегда использую именно этот способ.
Хм... это уже ближе к тому, что я имел в виду. Сейчас буду пробовать!
Этот минус есть и в обычном программировании. Но он решается компиляцией и запуском программы
Ну это, как я понял, убирается при поставке готовой программы. Да, теперь я вижу, что это, как раз, и заменяет ту самую фичу, которую я искал в дизайнере Спасибо, наконец-то, разобрался! Но, если честно, понять это было не так легко
Ещё раз спасибо за помощь!