Как фильтровать построенную матрицу

23.06.2021

В FastReport объект Матрица позволяет нам отфильтровать данные. Это одна из самых востребованных функциональных возможностей и многих пользователей она вполне устраивает. Однако есть случаи, когда фильтрация исходных данных не подходит.

Давайте рассмотрим матрицу ниже.

Исходная матрица

Как вы видите - это статистика продаж по сотрудникам за 5 лет. Для сотрудника Steven Buchanan нет статистики за 2011, 2012 и 2015 годы. Это означает, что если мы отфильтруем матрицу по годам и исключим 2013 и 2014 годы, то Steven пропадет из матрицы.

Для сохранения полноты картины нужно учитывать всех сотрудников, даже если у него не было продаж за отчетный период. В таком случае вам придется использовать один из вариантов:

1) искусственно обогащать сырые данные нулевыми значениями для каждого года, в котором у сотрудника не было продаж;
2) фильтровать уже построенную матрицу путем удаления ненужных колонок.

В шаблоне отчета:

Шаблон отчёта

Для ячейки Year добавим событие BeforePrint:

Для ячейки Year добавляем событие BeforePrint

Со следующим кодом:

private int index = 1;
 private List<int> removeColumns = new List<int>();
 
 private void Cell4_BeforePrint(object sender, EventArgs e)
 { 
 if (new List<int>(){2013, 2014}.Contains((int)Cell4.Value))
 {
 removeColumns.Add(index); 
 }
 index++; 
 }

Здесь мы записали индексы колонок, которые хотим удалить. Теперь, для матрицы создадим обработчик события ModifyResult для редактирования уже построенного объекта “матрица”:

 private void Matrix1_ModifyResult(object sender, EventArgs e)
 {
 removeColumns.Reverse();
 foreach (int del in removeColumns)
 { 
 Matrix1.ResultTable.Columns.RemoveAt(del);
 }
 }

Так как при удалении колонок или строк, индекс всех последующих смещается, то нужно удалять с конца - с самого большого индекса. Поэтому был выстроен список индексов для удаления в обратном порядке с помощью метода Reverse(). Далее просто удалили колонки по соответствующим индексам. Давайте посмотрим, что получилось в итоге:

Итоговая таблица

Из матрицы пропали столбцы для 2013 и 2014 годов, но сотрудник Steven Buchanan остался. Желаемый эффект достигнут! Также, можно удалять ненужные вам строки воспользовавшись другой коллекцией -  Matrix1.ResultTable.Rows. Теперь вы знаете, как фильтровать матрицу, если фильтрация данных не подходит.

20 ноября 2024

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

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

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

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

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

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