Обычно отчеты хранятся в одном месте, но в отдельных файлах. С ростом количества файлов появляются сложности в структурировании, поиске. Размышляя на эту тему, я наткнулся на одно очень интересное свойство объекта Report – ReportSourceString. В этом свойстве хранится весь шаблон отчета в строковом виде.
Исходя из этого, есть возможность хранить шаблоны отчета в любой базе данных. Мы получаем возможность хранить все отчеты в одном месте. …
Чтобы сохранять отчеты в базу данных, нам потребуется написать собственные методы сохранения и загрузки отчета. Итак, приступим.
Прежде всего, создаем базу данных для хранения отчетов. Я использовал MS Access.
Таблица имеет следующую структуру:
Имя поля |
Тип данных |
id |
Счетчик |
Name |
Текстовый |
Template |
Поле MEMO |
Создаем приложение WindowsForms. Добавляем подключение к нашей базе данных. На форме размещаем кнопку, компоненты DataSet, BindingSource и Report.
Забегая вперед, скажу, что нам потребуется диалоговая форма, на которой мы будем задавать имя отчета при сохранении/загрузке:
Для кнопок необходимо задать свойство DialogResult в соответствии с их названием.
Переходим к программированию. Используем следующие библиотеки FastReports:
1 2 3 4 5 |
using FastReport; using FastReport.Utils; using FastReport.Design; |
И создаем экземпляр диалоговой формы:
1 |
public SaveLoadForm form2 = new SaveLoadForm();
|
Создаем обработчик события сохранения отчета:
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 |
void cmdSave_CustomAction(object sender, EventArgs e) { ReportsDataSet.ReportsRow row; row = reportsDataSet1.Reports.NewReportsRow(); if (form2.ShowDialog() == DialogResult.OK) { row.Name = form2.ReportName; row.Template = report1.ReportResourceString; this.reportsDataSet1.Reports.Rows.Add(row); ReportsDataSetTableAdapters.ReportsTableAdapter adapter = new ReportsDataSetTableAdapters.ReportsTableAdapter(); adapter.Update(reportsDataSet1.Reports); } } |
Здесь, мы создаем новую строку в таблице отчетов. Затем запускаем диалоговую форму. В форме будет вводиться имя отчета. Полю Name присваиваем значение из текстового поля диалоговой формы. А в поле Template записываем шаблон отчета в текстовом виде.
После этого, посредством адаптера, сохраняем изменения в таблице.
Теперь создаем обработчик события загрузки отчета:
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 |
void cmdOpen_CustomAction(object sender, EventArgs e) { if (form2.ShowDialog() == DialogResult.OK) { for (int i = 1; i < reportsDataSet1.Reports.Rows.Count; i++) if (reportsDataSet1.Reports[i].Name == form2.ReportName) { report1.ReportResourceString = reportsDataSet1.Reports[i].Template.ToString(); } Designer designer = sender as Designer; designer.SetModified(this, "EditData"); } } |
Мы также вызываем диалоговую форму. В цикле ищем отчет с именем, соответствующем введенному в текстовом поле. Из поля Template отчет загружается в свойство ReportResourceString. Затем, для отображения изменений, обновляется дизайнер.
Итак, мы написали два обработчика. Теперь, нужно перехватить стандартные обработчики событий и подставить наши.
Как видно, мы перехватываем событие сохранения и загрузки отчета, подставив пользовательские обработчики.
На событие нажатия кнопки в главной форме добавляем следующий код:
1 2 3 4 5 6 7 8 9 |
private void DesignBtn_Click(object sender, EventArgs e) { Config.DesignerSettings.DesignerLoaded += DesignerSettings_DesignerLoaded; report1.Design(); } |
Переопределяем обработчик загрузки дизайнера отчетов.
Таким образом, мы создали приложение, которое позволяет сохранять и загружать отчеты в базу данных MS Access. Вы можете организовать хранение отчетов в любой удобной базе данных благодаря свойству отчета ReportSourceString.