Использование значения выражения в переменной
Текстовые компоненты, кроме текста, могут содержать выражения. В момент построения компонента, выражение обрабатывается генератором отчетов, т.е. производиться его вычисление. За исключением, итоговых сумм по бэнду или странице. В этом случае, результат высчитывается после полного построения бэнда или отчета. Порядок обработки компонентов ядром генератора отчетов определяется иерархией компонентов отчета. Иначе говоря, чем выше компонент в этой иерархии, тем выше его приоритет обработки при построении отчета. Полученное значение (результат вычисления выражения) передается в обработанный (построенный) компонент.
Информация |
Если текстовый компонент с выражением располагается на бэнде, то в построенном отчете, будет столько же экземпляров компонента, сколько строк в источнике данных бэнда.
|
Иногда возникает необходимость использовать результат выражения (рассчитанное значение) в переменной. Рассмотрим пример. Допустим есть выражение {x+y}, которое расположено в текстовом компонент Text10. Для того чтобы использовать результат этого выражения в переменной недостаточно указать ссылку {Text10.Text}. Потому как обращение, в данном случае, будет не к результату выражения, а к текстовому выражению в шаблоне отчета. Для использования результата выражения в переменной, следует воспользоваться одним из следующих вариантов:
Если необходимо получить значение компонента до его отрисовки, то следует: использовать такое же выражение в переменной, как в компоненте, или использовать два прохода, т.е на первом рассчитать значение, на втором использовать в переменной.
Если значение будет использоваться после отрисовки компонента, можно в событии GetValue компонента получить необходимое значение и сохранить (передать) его в переменную.
Также можно после построения всего отчета, в событии EndRender, пробежаться по всем компонентам построенного отчета и сделать необходимые вычисления. Ниже представлен пример скрипта, который подсчитывает сумму по странице, в случае, если у бэнда установлено свойство Can Break и заранее неизвестно, на какой странице окажется текстовый компонент.
C# |
... foreach (StiPage page in RenderedPages) { StiText sumComp = null; foreach (StiComponent component in page.Components) { if (component.Name == "sum_comp") { sumComp = component as StiText; break; } }
double sum = 0; foreach (StiComponent comp in page.Components) { if (comp.Name == "aaa") { sum += (double)(comp as StiText).TagValue; } } sumComp.Text = sum.ToString(); } ... |