Большинство генераторов отчетов имеют режим просмотра отчетов с панелью инструментов, из которой можно совершать различные манипуляции с отчетом. Например, перелистывать страницы, распечатывать, делать экспорт и многое другое. Однако, порой не хватает кнопки с каким-либо функционалом. Это может быть быстрый экспорт в какой-либо формат, или отправка отчета на ревью, а может быть вам захочется сделать массовую рассылку отчета. Так или иначе, но стандартная панель инструментов FastReport.Net не позволяет добавить свои кастомные функции. Но разработчики предусмотрели возможность создания собственного режима превью. И это здорово, не всем нравится стандартный Preview. Многие бы с удовольствием убрал некоторые ненужные кнопки, но добавили бы свои «фичи». Поэтому давайте рассмотрим, как просто и быстро сделать свой Preview для отчетов. Все функции из стандартного режима предварительного просмотра доступны нам в библиотеке FastReport.dll.
Давайте рассмотрим на примере. Обычное приложение WindowsForms. Подключаем к нему библиотеку FastReport.dll. На форму добавляем компонент панели инструментов ToolStrip и PreviewControl - это стандартный просмотрщик отчетов. Этот компонент уже имеет свою панель инструментов, но ее легко скрыть в свойстве ToolBarVisible.
На панели инструментов мы создали кнопки с необходимым функционалом:
Открыть отчет, распечатать, экспортировать, перелистывание страниц и одну специальную кнопку со своим функционалом. Она будет сохранять отчет в формате csv в заданную папку. Такой QuickSave. Допустим, мы часто пользуемся именно этим функционалом, вот и вынесли его на отдельную кнопку. Теперь посмотрим на код приложения:
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 |
public partial class Form1 : Form { private Report FReport; private DataSet FDataSet; //Создали объект отчета и источник данных public Form1() { InitializeComponent(); } private void LoadBtn_Click(object sender, EventArgs e) { FReport = new Report(); FReport.Preview = previewControl1; using (OpenFileDialog file = new OpenFileDialog()) { if (file.ShowDialog() == DialogResult.OK) { FDataSet = new DataSet(); FDataSet.ReadXml("K:/My documents/nwind.xml"); FReport.Load(file.FileName); FReport.RegisterData(FDataSet, "NorthWind"); FReport.Prepare(); FReport.ShowPrepared(); } } } |
Кнопка загрузки отчета открывает стандартное диалоговое окно открытия файла. Тут мы загружаем базу данных в источник данных, загружаем выбранный шаблон отчета в объект отчета, регистрируем в нем источник данных, собираем и отображаем отчет в компоненте Preview.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private void SaveBtn_Click(object sender, EventArgs e) { SaveBtn.DropDownItems.Clear(); List<ObjectInfo> list = new List<ObjectInfo>(); RegisteredObjects.Objects.EnumItems(list); ToolStripMenuItem saveNative = new ToolStripMenuItem("Save to .fpx file..."); saveNative.Click += new EventHandler(item_Click); SaveBtn.DropDownItems.Add(saveNative); foreach (ObjectInfo info in list) { if (info.Object != null && info.Object.IsSubclassOf(typeof(ExportBase))) { ToolStripMenuItem item = new ToolStripMenuItem(Res.TryGet(info.Text) + "..."); item.Tag = info; item.Click += new EventHandler(item_Click); if (info.ImageIndex != -1) item.Image = Res.GetImage(info.ImageIndex); SaveBtn.DropDownItems.Add(item); } } } |
Кнопка экспорта/сохранения на самом деле имеет выпадающий список с различными форматами экспорта. Сначала, я очищаю выпадающий список и создаю список для объектов экспорта. Загружаю в список все зарегистрированные объекты.
Затем, я добавляю первый элемент списка экспортов – нативный формат экспорта, то есть формат fpx. Все остальные доступные форматы добавляются в список в цикле. Некоторые из экспортов имеют картинку. Каждый элемент списка подписывается на событие item_Click, которое обрабатывает нажатие на элемент.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void item_Click(object sender, EventArgs e) { ObjectInfo info = (sender as ToolStripMenuItem).Tag as ObjectInfo; if (info == null) { previewControl1.Save(); } else { ExportBase export = Activator.CreateInstance(info.Object) as ExportBase; export.CurPage = previewControl1.PageNo; export.Export(previewControl1.Report); } } |
Обработчик события item_Click выполняет экспорт отчета, который в данный момент отображен в компоненте Preview.
1 2 3 4 |
private void PrintBtn_Click(object sender, EventArgs e) { previewControl1.Print(); } |
Кнопка печати вызывает диалоговое окно печати документа.
1 2 3 4 |
private void FirstBtn_Click(object sender, EventArgs e) { previewControl1.First(); } |
Кнопка First отображает первую страницу отчета.
1 2 3 4 |
private void PrevBtn_Click(object sender, EventArgs e) { previewControl1.Prior(); } |
Кнопка Prev отображает предыдущую страницу отчета.
1 2 3 4 |
private void NextBtn_Click(object sender, EventArgs e) { previewControl1.Next(); } |
Кнопка Next отображает следующую страницу отчета.
1 2 3 4 |
private void LastBtn_Click(object sender, EventArgs e) { previewControl1.Last(); } |
И, наконец, кнопка Last отображает последнюю страницу отчета.
1 2 3 4 5 6 7 |
private void PageNo_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { previewControl1.PageNo = int.Parse(PageNo.Text); } } |
Текстовое поле между кнопками отображает номер текущей страницы. Изменяя его значения можно также перелистывать страницы отчета.
1 2 3 4 |
private void PreviewControl1_PageChanged(object sender, EventArgs e) { PageNo.Text = previewControl1.PageNo.ToString(); } |
Но, если перелистывать страницы кнопками, номер страницы в этом текстовом поле тоже изменяется. По событию изменения страницы в компоненте Preview.
1 2 3 4 5 |
private void QuickSaveCSVBtn_Click(object sender, EventArgs e) { FastReport.Export.Csv.CSVExport ex = new FastReport.Export.Csv.CSVExport(); FReport.Export(ex, "Text.csv"); } |
В завершение – наша кастомная кнопка. Ее функционал взят с потолка, просто для демонстрации. Она сохраняет отчет в формате csv. Таким образом вы можете сделать просмотрщик отчетов удобным для себя или заказчика, снабдив его нужными функциями.
Фантазировать на тему дополнительных функций в Preview можно бесконечно, главное, что разработчики дали нам такую возможность.
А если вы хотите использовать свой превью компонент при отображении отчетов из кода приложения, то пользуемся следующим кодом:
Тут мы переопределили компонент просмотра отчета. Правда пришлось сделать previewControl1 публичным.
На этом все. Надеюсь вы воспользуетесь такой прекрасной возможностью, как сделать кастомный просмотрщик отчетов.