Пример 9. Заполнение матрицы вручную
Во всех рассмотренных примерах матрица заполнялась данными автоматически, потому что была привязана к источнику данных. Источник данных для матрицы указывается в свойстве DataSource
. Хотя мы и не устанавливали значение этого свойства вручную, это происходило неявно при добавлении поля данных в матрицу.
Используя скрипт, можно заполнять матрицу вручную. Для этого надо создать обработчик события ManualBuild
матрицы. В коде обработчика надо вызывать метод AddValue для добавления значения. Покажем на примере, как создать матрицу, которая будет печатать таблицу 10х10 с значениями, расположенными по диагонали:
1 | 2 | 3 | ... | |
---|---|---|---|---|
1 | 1 | |||
2 | 2 | |||
3 | 3 | |||
... | ... |
Выполните следующие действия:
- добавьте в отчет пустую матрицу;
- в строку, колонку и ячейку матрицы поместите любой элемент из окна "Данные". Затем вызовите редактор выражения, сделав двойной щелчок на элементе матрицы, и очистите выражение;
- очистите свойство
DataSource
матрицы.
В результате матрица будет выглядеть следующим образом:
Теперь создайте обработчик события ManualBuild
. Для этого выделите матрицу, в окне "Свойства" нажмите кнопку и сделайте двойной щелчок на событии
ManualBuild
. FastReport создаст пустой обработчик события. Напишите в нем следующий код:
private void Matrix1_ManualBuild(object sender, EventArgs e)
{
// В нашей матрице 1 измерение в строке, колонке и ячейке данных.
// Создадим 3 массива типа object[], каждый с 1 элементом (по количеству измерений).
object[] columnValues = new object[1];
object[] rowValues = new object[1];
object[] cellValues = new object[1];
for (int i = 1; i <= 10; i++)
{
// Заполняем массивы
columnValues[0] = i;
rowValues[0] = i;
cellValues[0] = i;
// Добавляем данные в матрицу
Matrix1.AddValue(columnValues, rowValues, cellValues);
}
}
В обработчике необходимо добавить нужные данные в матрицу с помощью метода AddValue
объекта "Матрица". Этот метод имеет три параметра, каждый из которых является массивом значений типа object
. Первый параметр – это значения колонки, второй – значения строки, третий – значения ячеек. Заметьте – количество значений в каждом массиве должно соответствовать настройке объекта! В нашем случае объект имеет по одному уровню в заголовках колонок, строк и ячеек – соответственно, мы передаем в AddValue
по одному значению для колонок, строк и ячеек.
Если запустить отчет на выполнение, мы увидим следующее:
Покажем на примере, как добавить в матрицу значение "21" на пересечении колонки 7 и строки 3. Для этого измените код следующим образом:
private void Matrix1_ManualBuild(object sender, EventArgs e)
{
object[] columnValues = new object[1];
object[] rowValues = new object[1];
object[] cellValues = new object[1];
for (int i = 1; i <= 10; i++)
{
columnValues[0] = i;
rowValues[0] = i;
cellValues[0] = i;
Matrix1.AddValue(columnValues, rowValues, cellValues);
}
columnValues[0] = 7;
rowValues[0] = 3;
cellValues[0] = 21;
Matrix1.AddValue(columnValues, rowValues, cellValues);
}
В результате получится следующее:
Как видно, матрица автоматически рассчитывает итоги по строкам и колонкам.
Вы можете использовать обработчик события ManualBuild
для матрицы, которая подключена к данным. В этом случае сначала вызывается обработчик события, затем происходит заполнение матрицы данными из источника.