Чтобы передать источник данных в отчет, его необходимо предварительно зарегистрировать в отчете. Затем уже в самом отчете надо выбрать доступный источник из списка, и только после этого приступать к работе. Было бы здорово, чтобы источник данных был доступен сразу, стоит лишь открыть дизайнер отчета. А еще лучше, если в дизайнере отчета он будет уже выбран. Приступать к разработке отчета можно немедленно, не заботясь о данных.
Такой подход позволит избежать рутинной работы при массовой разработке отчетов.
Сделать регистрацию источника данных и автоматический его выбор в отчете при запуске дизайнера – задача не сложная. Основная проблема - сохранять зарегистрированный источник данных при создании нового отчета при помощи меню Файл.
Суть способа, который я хочу представить – перехватывать процесс создания нового отчета при использовании меню Файл.
Итак, рассмотрим все на примере. Создаем приложение с формой и одной кнопкой.
Для работы потребуются библиотеки:
1 2 3 4 5 |
using FastReport; using FastReport.Utils; using FastReport.Data; using FastReport.Design; using FastReport.Wizards; |
Объявляем источник данных и создаем его:
1 2 3 4 5 6 7 |
private DataSet FDataSet; private void CreateDataSource() { FDataSet = new DataSet(); FDataSet.ReadXml(Environment.CurrentDirectory + "//nwind.xml"); } |
В данном случае, использовал базу данных XML из поставки FastReport .Net.
Создаем метод регистрации источника данных:
1 2 3 4 5 6 7 8 9 |
private void RegisterData(Report FReport) { FReport.RegisterData(FDataSet, "NorthWind"); // activate all data sources by default foreach (DataSourceBase source in FReport.Dictionary.DataSources) { source.Enabled = true; } } |
Здесь интересен цикл, который проходит по всем источникам данных, зарегистрированным в отчете, и активирует их. Таким образом, они будут сразу доступны в окне данных.
Вызываем обработчик события запуска дизайнера отчета:
1 2 3 4 |
private void DesignerSettings_DesignerLoaded(object sender, EventArgs e) { (sender as Designer).cmdNew.CustomAction += new EventHandler(cmdNew_CustomAction); } |
Добавляем пользовательский обработчик для события создания нового отчета через меню Файл.
Теперь нужно написать этот пользовательский обработчик. Он будет создавать новый пустой отчет с уже добавленным источником данных:
1 2 3 4 5 6 7 8 9 10 11 |
void cmdNew_CustomAction(object sender, EventArgs e) { Designer designer = sender as Designer; //StandardReportWizard wizard = new StandardReportWizard(); // you can use any wizard form package BlankReportWizard wizard = new BlankReportWizard(); wizard.Run(designer); RegisterData(designer.Report); // refresh data tree view designer.SetModified(this, "EditData"); } |
Здесь мы создаем экземпляр объекта пустого отчета, либо запускаем «Мастер создания стандартного отчета», на выбор. Затем открываем новый отчет в дизайнере. Повторно регистрируем источник данных и обновляем список в дереве данных.
Осталось написать обработчик нажатия кнопки:
1 2 3 4 5 6 7 8 9 10 |
private void button1_Click(object sender, EventArgs e) { Report FReport = new Report(); Config.DesignerSettings.DesignerLoaded += DesignerSettings_DesignerLoaded; CreateDataSource(); // FReport.Load("myreport.frx"); // load report RegisterData(FReport); // register data before design FReport.Design(); } |
Создаем экземпляр объекта отчета. Присваиваем обработчик загрузки дизайнера отчетов, который мы написали, вместо стандартного. Создаем источник данных. Теперь можно загрузить отчет, либо не делать этого. Тогда будет создан пустой. Обязательно перед вызовом дизайнера регистрируем данные.
Теперь при запуске дизайнера таблицы базы данных будут сразу отображаться в окне «Данные». Также и при создании нового отчета через меню Файл, источник данных будет добавлен.
В этой статье я показал, как перехватить процесс создания нового отчета, если создавать его через меню Файл. По такому же принципу можно перекрыть другие действия дизайнера, такие как Save.