Пример 9. Заполнение матрицы вручную

Top  Previous  Next

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

 

Используя скрипт, можно заполнять матрицу вручную. Для этого надо создать обработчик события ManualBuild матрицы. В коде обработчика надо вызывать метод AddValue для добавления значения. Покажем на примере, как создать матрицу, которая будет печатать таблицу 10х10 с значениями, расположенными по диагонали:

 

 

1

2

3

...

1

1

 

 

 

2

 

2

 

 

3

 

 

3

 

...

 

 

 

...

 

Выполните следующие действия:

 

добавьте в отчет пустую матрицу;
в строку, колонку и ячейку матрицы поместите любой элемент из окна "Данные". Затем вызовите редактор выражения, сделав двойной щелчок на элементе матрицы, и очистите выражение;
очистите свойство DataSource матрицы.

 

В результате матрица будет выглядеть следующим образом:

 

matrixExample9

 

Теперь создайте обработчик события ManualBuild. Для этого выделите матрицу, в окне "Свойства" нажмите кнопку btn79и сделайте двойной щелчок на событии 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 по одному значению для колонок, строк и ячеек.

 

Если запустить отчет на выполнение, мы увидим следующее:

 

matrixExample9Result

 

Покажем на примере, как добавить в матрицу значение "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);

}

 

В результате получится следующее:

 

matrixExample9Result1

 

Как видно, матрица автоматически рассчитывает итоги по строкам и колонкам.

 

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