Как создать собственную панель инструментов в 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 публичным.

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

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.