Многостраничный однообразный отчёт: наиболее оптимальный способ

отредактировано 03:47 Раздел: FastReport .NET
Всем доброе время суток!

Я пишу на C#, используя WinForms. Изучаю FastReport 1.1.27, являюсь начинающим. Но по документации уже научился составлять простые отчёты, используя параметры. Так же научился получать в коде и динамически добавлять строки в объект FastReport.Table.TableObject. Но недавно появилась новая задача и как справиться с ней, пока я не очень себе представляю. Точнее, представляю, но, боюсь, это будет слишком нерационально и есть какой-то специально предусмотренный механизм.

Ситуация: имеется список(List) работников(имя, фамилия, список детей). Необходимо сгенерировать отчёт, состоящий из нескольких страниц, каждая из которых должна содержать имя, фамилию + таблицу с детьми по каждому работнику.

Мои действия(наполнение таблиц я описанным методом уже производил, а реализация многостраничности отчёта - это только предположение):
- В дизайнере создаю страницу, на ней два текстовых поля для имени и фамилии.
- Добавляю параметры в отчёт: имя и фамилия, затем их же прописываю в текстовых полях.
- Создаю шапку таблицы для детей.
- В коде приложения, в обработчике события OnPrint() перед тем, как показать отчёт, в цикле для каждого работника создаю в объекте отчёта копию приготовленной в дизайне страницы, передаю туда параметры(имя, фамилия), затем получаю FastReport.Table.TableObject и в цикле для каждого ребёнка инициализирую и добавляю объекты FastReport.Table.TableRow.
- Вызываю метод Show() отчёта.


Вопрос: являются ли мои действия правильными? Это касается как создания страниц отчёта по каждому работнику, так и наполнения таблиц с именами детей. Мне, почему-то, кажется, что для этого предусмотрены какие-то специальные методы вроде:
- для наполнения таблиц: передача в отчёт целого списка, к примеру, List<Children> и последующего биндинга полей класса Children к столбцам таблицы. Т.е. отчёт сам занимается заполнением строк таблицы в цикле.
- для создания отдельных страниц: что-то вроде наполнения таблиц...


Если такие методы существуют, очень прошу, ткните пожалуйста в соответствующие разделы документаций! Сам я пока что нашёл лишь то, что могу из кода установить в отчёт в качестве DataSource - объект IEnumerable, т.е. свой список. А, вот, как дальше - не пойму...

Очень надеюсь на вашу помощь, заранее спасибо!

Комментарии

  • отредактировано 03:47
    Здравствуйте,

    Посмотрите отчет "Features/Business Objects" - master-detail список категорий и продуктов, из источника типа IEnumerable. Чтобы вывести каждую категорию на отдельном листе, щелкните правой кнопкой мыши на бэнде Data1 и выберите пункт "Формировать новую страницу".
  • отредактировано 03:47
    Добавлю: объект "Таблица" не является, как бы это сказать, основным инструментом (таким, как в Microsoft Report Viewer, например). В FastReport основа всего - это бэнды и объект "Текст". Да, можно использовать таблицу (и даже ее динамический режим), но почти всегда можно достичь того же самого с помощью обычных бэндов.
  • отредактировано October 2009
    AlexTZ написал: »
    Посмотрите отчет "Features/Business Objects" - master-detail список категорий и продуктов, из источника типа IEnumerable. Чтобы вывести каждую категорию на отдельном листе, щелкните правой кнопкой мыши на бэнде Data1 и выберите пункт "Формировать новую страницу".
    Спасибо, посмотрел. Только ума не приложу, как добавить в источники данных business object? Про метод RegisterData я знаю, но ведь от того, что я использую его в своём приложении, в дизайнере этот источник не появится! А в демке бизнес-объект уже в дизайнере! Или я чего-то не знаю? Ведь простым параметром IEnumerable не добавить...
    Дело в том, что при попытке добавить новый источник данных в дизайнере, у меня открываются параметры для подключения к БД и ни намёка на то, что я могу добавить IEnumerable. Как это(RegisterData() и управление бизнес-объектом в дизайнере) связать?

    AlexTZ написал: »
    Добавлю: объект "Таблица" не является, как бы это сказать, основным инструментом (таким, как в Microsoft Report Viewer, например). В FastReport основа всего - это бэнды и объект "Текст". Да, можно использовать таблицу (и даже ее динамический режим), но почти всегда можно достичь того же самого с помощью обычных бэндов.
    Но, ведь, бэнды - это сугубо "горизонтальное" понятие? А если нужны столбцы? Как их создать без таблицы? (я, скорее всего, чего-то просто ещё не знаю, но очень хочу узнать :) )
  • отредактировано 03:47
    написал:
    Дело в том, что при попытке добавить новый источник данных в дизайнере, у меня открываются параметры для подключения к БД и ни намёка на то, что я могу добавить IEnumerable.
    В меню "Данные" можно выбрать как существующий (зарегистрированный) источник, так и создать новый (подключение к БД). Вам нужно выбрать существующий источник, пункт "Выбрать данные для отчета...". Там и увидите бизнес-объект.
    написал:
    Но, ведь, бэнды - это сугубо "горизонтальное" понятие? А если нужны столбцы?
    Столбцы бывают разные :)
    Если нужно печатать на странице в несколько колонок - это одно (в настройках страницы ставите количество колонок и все). Если нужна развертка отчета по вертикали - тогда да, таблица делалась именно для этого. Посмотрите еще объект "Матрица" (если структура Ваших данных позволяет его использовать).
  • отредактировано October 2009
    Спасибо за Ваши ответы.
    AlexTZ написал: »
    ...
    Вам нужно выбрать существующий источник, пункт "Выбрать данные для отчета...". Там и увидите бизнес-объект.
    ...
    Там у меня пусто. А бизнес-объект я устанавливаю в методе-обработчике события "Показать отчёт". Т.е. файл отчёта ".frx" я создаю в дизайнере(прикрепил пример). Затем, уже во время работы программы, когда пользователь жмёт кнопку "Отчёт", я заполняю этот отчёт данными и вызываю метод Show(). Так вот я не пойму, как увязать вызовы из кода и работу в дизайнере? Изменения в дизаянере я вижу в коде, но не наоброт! Или, может, я не там изменения делаю?
    AlexTZ написал: »
    ...
    в настройках страницы ставите количество колонок и все
    ...
    Поставил 3. На странице отчёта появилась серая область. А как управлять колонками почему-то не понял. Ладно, это я разберусь... Мне было бы интересно узнать, обычно для моей задачи какие средства используют? Т.е. самый распространённый и оптимальный вариант? Бизнес-объекты и таблицы? Или нет? И какой метод соединения программных и отображаемых данных? В коде или в дизайнере? И какая часть в коде, а какая в дизайнере? Как-то у меня всё смешалось и чувствую, что какой-то детали просто не знаю, а когда узнаю, всё встанет на свои места :) Был бы Вам очень признателен за пояснения...

    И ещё вопрос: было бы любопытно посмотреть на код подготовки отчёта в примере демки "Features/Business Objects". Это возможно? А то я виду только то, что к отчёту подключены данные в виде бизнес-объекта. А как они используются в коде - не знаю...

  • отредактировано 03:47
    Все очень просто: перед вызовом дизайнера регистрируйте бизнес-объект, как и при запуске отчета. Так делается в Demo.exe, и все отчеты для демо я сделал в нем же. Если у Вас нет такой возможности - сожалею, полноценно использовать FastReport у Вас не получится. Ибо передавать поля БД через параметры отчета, вручную заполнять таблицы и пр. - это, скажем так, не тот сценарий работы, ради которого создавался FastReport.

    Про колонки читаем здесь:
    http://fast-report.com/documentation/UserM...withcolumns.htm

    Исходник Demo.exe берем здесь:
    C:\Program Files\FastReports\FastReport.Net Demo\Demos\C#\Main
  • отредактировано October 2009
    AlexTZ написал: »
    Все очень просто: перед вызовом дизайнера регистрируйте бизнес-объект, как и при запуске отчета.
    Хм... Дело в том, что дизайнер я запускаю во время того, как пишу код. Т.е. дизайнер для меня - это что-то сродни дизайнера форм в VisualStudio, иными словами - средство разработчика для создания отчёта. А как я могу зарегистрировать бизнес-объект во время разработки, кроме как средствами дизайнера? Ведь, например, я в дизайнере могу добавить параметр, назвать его, а потом использовать в текстовом поле!
    AlexTZ написал: »
    Ибо передавать поля БД через параметры отчета, вручную заполнять таблицы и пр. - это, скажем так, не тот сценарий работы, ради которого создавался FastReport.
    Т.е. Вы имеете в виду, что "тот сценарий работы, ради которого создавался FastReport" - это давать возможность конечному пользователю запускать дизайнер и править файл отчёта с целью выбрать, какие данные показывать, а затем открывать отчёт?
    AlexTZ написал: »
    Про колонки читаем здесь:
    Исходник Demo.exe берем здесь:
    Спасибо, премного благодарен. Уже смотрю...
  • отредактировано October 2009
    Посмотрел код. На данный момент вопрос состоит вот в чём: как получить frx-файл с уже зарегистированным источником данных? Ведь в этих исходниках так и получается. Если открыть frx-файл отдельно, источник данных "Categories" там уже есть, со всеми необходимыми полями. Т.е. я спокойно могу в дизайнере распределять части этого источника данных по листу. При запуске отчёта Вы лишь сопоставляете реальные данные с тем "объявленными", что хранятся в файле отчёта. Создать эти "объявленные" данные из дизайнера можно? Или единственный путь - написать в коде:
    report.RegisterData(this.vacationList, "List", 1);
    report.Save(Const.REPORTS_DIR + @"\report.frx");
    
    ?
  • отредактировано 03:47
    Я хотел сказать, что для полноценного создания отчета нужен источник данных. Если источника нет - придется как-то изворачиваться с переменными и пр. Это - неправильный и непродуктивный подход.
  • отредактировано 03:47
    AlexTZ написал: »
    Я хотел сказать, что для полноценного создания отчета нужен источник данных. Если источника нет - придется как-то изворачиваться с переменными и пр. Это - неправильный и непродуктивный подход.
    А, ну это понятно... Если Вам не сложно, ответьте, пожалуйста, на предыдущее моё сообщение про источник данных. Возможно, Вы его не заметили, т.к. я написал его почти одновременно с Вами. Спасибо.
  • отредактировано 03:47
    Бизнес-объект регистрируется в отчете, перед его построением либо перед запуском дизайнера. В дизайнере в любой момент можно зайти в меню "Данные/Выбрать данные для отчета..." и пометить нужные источники. Те источники, которые выбраны - будут сохранены в файл отчета. При загрузке такого отчета, и последующем вызове report.RegisterData(...), FastReport связывает имеющийся в отчете источник с реальным (который передается в RegisterData).

    Вы спрашиваете, как получить такой файл. Надо зарегистрировать источник (RegisterData), вызвать дизайнер, отметить источник в меню "Данные/Выбрать данные для отчета..." и сохранить файл.
  • отредактировано 03:47
    Еще замечание по поводу
    написал:
    Хм... Дело в том, что дизайнер я запускаю во время того, как пишу код.
    Допустим, в коде у Вас есть бизнес-объект, который надо использовать в отчете. Есть два способа создать отчет:
    1) В дизайн-тайме Visual Studio. Кладете на форму компонент BindingSource и привязываете его к своему объекту. Далее кладете компонент Report и выбираете в качестве источника - bindingSource1. Этого достаточно для создания нормального отчета. Единственный минус - в дизайн-тайме Вы работаете без "живых" данных, т.е. просмотреть отчет не получится.
    2) В работающем приложении. Делаете примерно так, как в Demo.exe. Несомненный плюс - есть живые данные. Я всегда использую именно этот способ.
  • отредактировано October 2009
    AlexTZ написал: »
    Вы спрашиваете, как получить такой файл. Надо зарегистрировать источник (RegisterData), вызвать дизайнер, отметить источник в меню "Данные/Выбрать данные для отчета..." и сохранить файл.
    Вот. Т.е. для того, чтобы создать файл отчёта, в котором уже зарегистрирован источник данных типа "BusinessObject", мне необходимо написать для этого программку. Мне представляется более логичным, чтобы регистрация подобного источника данных происходила так же, как и добавление параметров - в дизайнере. Т.е. я запускаю дизайнер, создаю отчёт с нуля и в любое время могу зарегистрировать источник данных, указать его имя, добавить в него необходимые поля и сохранить файл отчёта! Затем положить его в директорию рядом с исполняемым файлом приложения и с помощью метода Load() загружать в программу и далее уже связывать данные с реальными(по имени источника, указанном в дизайнере ранее)! Честно говоря, думал, что так оно и есть.
    AlexTZ написал: »
    1) В дизайн-тайме Visual Studio. Кладете на форму компонент BindingSource и привязываете его к своему объекту. Далее кладете компонент Report и выбираете в качестве источника - bindingSource1. Этого достаточно для создания нормального отчета.
    Хм... это уже ближе к тому, что я имел в виду. Сейчас буду пробовать!
    AlexTZ написал: »
    Единственный минус - в дизайн-тайме Вы работаете без "живых" данных, т.е. просмотреть отчет не получится.
    Этот минус есть и в обычном программировании. Но он решается компиляцией и запуском программы :)
  • отредактировано 03:47
    написал:
    Т.е. для того, чтобы создать файл отчёта, в котором уже зарегистрирован источник данных типа "BusinessObject", мне необходимо написать для этого программку.
    Не вижу никаких сложностей написать такую программку :)
    using (Report report = new Report())
    {
      report.RegisterData(your_list, "YourList");
      report.Design();
    }
    
    Зато - работа с живыми данными, а это большой плюс. Не надо, как в первом варианте, компилить и запускать программу только для того, чтобы посмотреть отчет. Увидеть, что данные разместились не так, как хотелось, опять возвращаться в дизайнер, опять компилить программу... Долго это.
  • отредактировано 03:47
    AlexTZ написал: »
    Не вижу никаких сложностей написать такую программку :)

    Ну это, как я понял, убирается при поставке готовой программы. Да, теперь я вижу, что это, как раз, и заменяет ту самую фичу, которую я искал в дизайнере :) Спасибо, наконец-то, разобрался! Но, если честно, понять это было не так легко :)

    Ещё раз спасибо за помощь!
  • отредактировано 03:47
    Да, именно так - из готовой программы это можно убрать. Пожалуйста! :)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.