Как создать собственную панель инструментов в Preview отчета

08.01.2020

Большинство генераторов отчетов имеют режим просмотра отчетов с панелью инструментов, из которой можно совершать различные манипуляции с отчетом. Например, перелистывать страницы, распечатывать, делать экспорт и многое другое. Однако, порой не хватает кнопки с каким-либо функционалом. Это может быть быстрый экспорт в какой-либо формат, или отправка отчета на ревью, а может быть вам захочется сделать массовую рассылку отчета. Так или иначе, но стандартная панель инструментов 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 можно бесконечно, главное, что разработчики дали нам такую возможность.

А если вы хотите использовать свой превью компонент при отображении отчетов из кода приложения, то пользуемся следующим кодом:

1
2
3
4
5
6
CusomPreviewForm prev = new CusomPreviewForm ();
Report report = new Report();
report.Load("K:/My documents/lines.frx");
report.Preview = prev.previewControl1;
report.Show();
prev.ShowDialog();

Тут мы переопределили компонент просмотра отчета. Правда пришлось сделать previewControl1 публичным.

На этом все. Надеюсь вы воспользуетесь такой прекрасной возможностью, как сделать кастомный просмотрщик отчетов.

.NET FastReport .NET FastReport
11 марта 2025

Как использовать FastReport .NET Avalonia на Fedora Workstation с протоколом Wayland

В данной статье мы разберем, как запустить FastReport .NET Avalonia на операционной системе «Fedora Workstation 39» с протоколом Wayland.
7 марта 2025

Как создать QR-код с картинкой в FastReport .NET

В статье разобрались как вставлять картинку в QR Code из дизайнера отчётов FastReport .NET всего за пару кликов.
20 февраля 2025

Использование матричных принтеров для печати чеков

В этой статье мы рассмотрим, как интегрировать матричный принтер в процесс создания и вывода отчетов с использованием FastReport .NET.