Здравствуйте.
Андрей Сакольчик писал(а):Для начала оговорюсь, что честно поискал в мануалах и форуме, но решения не нашел.
Суть в следующем: создаю в словаре переменную, которая должна инициализироваться выражением - фактически ей надо присвоить значение поля, расположенного на ReportSummaryBand. Если в выражении писать Text10.Text, компилятор ругается "Ссылка на объект не указывает на экземпляр объекта." Перепробовал кучу вариантов обращения к содержимому поля - непротык. Как посоветуете обратиться к полю из редактора текста выражения переменной?
Для начала давайте разберёмся с понятиями.
Есть компонент шаблона, который содержит выражения для вычисления. А есть компоненты, которые находятся уже на страницах отрендеренного отчёта.
Во время построения отчета движок генератора отчетов берёт выражение из компонента шаблона, вычисляет его и записывает полученное значение в компонент на странице, которая в текущий момент рендерится.
Если текстовый компонент находится на бэнде, то на страницах отрендеренного отчёта будет столько же экземпляров компонента с таким именем, сколько строк в источнике данных бэнда.
Поэтому с помощью выражения {Text10.Text} вы получите текстовое значение выражения, которое содержится в шаблоне отчёта, а не в построенном отчёте.
Далее, надо знать, в каком месте и в какое время вы хотите использовать значение.
Значение выражения высчитывается в момент рендеринга данного компонента (кроме сумм по бэнду/странице, которые высчитываются после полного построения бэнда/отчета).
Порядок обработки компонентов определяется деревом отчета: чем выше компонент в дереве, тем раньше построится.
Поэтому возможны следующие варианты:
1. Если вы хотите получить значение компонента до его отрисовки, то надо: либо использовать такое же выражение, как в компоненте, либо использовать два прохода (на первом рассчитать, на втором использовать).
2. Если значение будет использоваться после отрисовки компонента, можно в событии GetValue компонента получить нужное значение и сохранить его в переменной для дальнейшего использования.
3. Ещё один вариант - после построения всего отчета, в событии EndRender пробежаться по всем компонентам построенного отчёта и сделать необходимые вычисления.
Вот пример скрипта, который подсчитывает сумму по странице для специфического случая - у бэнда установлено свойство Can Break и заранее неизвестно, на какой странице окажется текстовый компонент.
Код: Выделить всё
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();
}
Более конкретные рекомендации мы сможем дать, если вы пришлёте нам пример отчёта, который воспроизводит вашу проблему.
Спасибо.