Как сделать выделение столбцов цветом, в зависимости от значения столбца

09.01.2019

Матричные отчеты – отличный инструмент для анализа данных. По сути матрица в аналитических отчетах - это сводная таблица. Для облегчения анализа часто используют «условное выделение». Это штатный инструмент в FastReport.Net. Условное выделение подразумевает выделение ячеек данных цветом, шрифтом или иконками в зависимости о заданного условия. Но, условное выделение работает с отдельными ячейками. А что, если мы хотим выделять столбцы целиком в зависимости от значения в заголовке? Например, чтобы выделить выходные дни.  В этом случае придется прибегнуть к «всесильному» скрипту отчета, штатные средства выделения цветом тут не помогут.

Создадим шаблон с матрицей на основе таблицы MatrixDemo из демонстрационной базы данных nwind.xml:

Идея в том, чтобы найти столбцы со значениями в заголовках, удовлетворяющих условию. В этой матрице мы выводим доход сотрудников по годам.

Давайте сделаем выделение столбцов с заголовками 2012 и 2014 года. Для этого нам нужно выделить цветом заголовок в этом столбце и все последующие ячейки, включая итог. Создадим событие BeforePrint для матрицы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Список отмеченных столбцов
 private List<int> markedColumns;
 // Счетчик для столбцов в первой строке
 private int firstLineColumn;
 // Счетчик для столбцов в следующих строках
 private int secondLineColumn;
 
// Обработчик события матрицы
 private void Matrix2_BeforePrint(object sender, EventArgs e)
 {
 // Создать новый список для отмеченных столбцов
 markedColumns = new List<int>();
 // Сбросить счетчик первой строки
 firstLineColumn = 0;
 // Сбросить счетчик последующих строк
 secondLineColumn = 0;
 }
 

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

Создадим еще один обработчик события BeforePrint для ячейки со значением [Year]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 // Обработчик событий для ячеек в первой строке матрицы
 private void Cell18_BeforePrint(object sender, EventArgs e)
 {
 // Использовать sender как TableCell
 TableCell cell = sender as TableCell;
 // Проверка необходимого значения в ячейке
 if (cell.Text == "2012" || cell.Text == "2014") 
 {
 // Устанавливает цвет заливки для этой ячейки
 cell.FillColor = Color.Brown;
 // Сохранить в списке отмеченных столбцов
 markedColumns.Add(firstLineColumn);
 }
 // Увеличить счетчик колонок для первой строки
 firstLineColumn++;
 } 

Здесь нужно сделать небольшую ремарку, чтобы вы поняли суть происходящего. Дело в том, что вывод матрицы при построении отчета в FastReport происходит построчно. Поэтому мы и сохраняем номера колонок для первой строки матрицы. В нашем случае в список помеченных колонок попадет 2 значения.

Теперь добавим обработчик события для ячейки со значением [Revenue]:   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 // Обработчик событий для ячеек в следующих строках матрицы. Вам нужно установить его для второй строки и итогов.
 private void Cell21_BeforePrint(object sender, EventArgs e)
 {
 // Использовать sender как TableCell
 TableCell cell = sender as TableCell;
 // Найти текущий индекс в списке markedColumns
 if (markedColumns.IndexOf(secondLineColumn) != -1)
 {
 // Устанавливает цвет заливки для этой ячейки
 cell.FillColor = Color.Red;
 }
 // Увеличить счетчик
 secondLineColumn++;
 // Сбросить счетчик для следующей строки
 if (secondLineColumn >= firstLineColumn)
 secondLineColumn = 0;

 В этом обработчике мы находим колонки, соответствующие выбранным колонкам из первой строки и окрашиваем ячейки в них красным цветом. По достижении последней колонки, обнуляем переменную для следующей строки. Как вы понимаете, при построении отчета, вторая строка матрицы динамическая. Это значит, что она будет выводиться для каждой строки данных в источнике. Поэтому нам нужно проверить каждую строку и окрасить ячейки в нужных колонках.

Решение, приведенное в скрипте необычное, но единственно возможное для данной ситуации, потому что матрица строится динамически и не хранит окончательную структуру, координаты и позиции ячеек до непосредственной отрисовки на листе. В памяти хранится только шаблон (тот, что мы видим в дизайнере) и текстовые значения заголовков матрицы.

Поэтому нам приходится перебирать все строки и запоминать колонки для окрашивания.

Судя по скрипту, мы должны были создать три обработчика события BeforePrint для: матрицы, ячейки [Year] и ячейки [Revenue]. Но, в нашей матрице есть еще одна, третья строка. В ней выводятся итоги, и хорошо бы их тоже окрашивать согласно выбранным колонкам. Для этого, для ячейки, расположенной под [Revenue] просто подпцепите обработчик события BeforeFrint от все той же [Revenue]:

 

А теперь, запустим отчет:  

 

Если вы хотите окрашивать итоги в другой цвет – придется создать для ячейки итогов собственный обработчик события BeforePrint, аналогичный обработчику для ячейки [Revenue].

20 ноября 2024

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

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

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

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

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

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