Страница 1 из 1

Скрытие Watermark из обработчика не работает после обновления 2013 -> 2018

Добавлено: 13 сен 2018, 17:39
Артём
Добрый день.
Использовали для рендеринга версию StimulSoft Reports .NET 2013.
Сейчас обновляемся до 2018-й (Stimulsoft.Reports.Net, 2018.2.3)
В отчётах активно используется C# код.
Столкнулся со следующей проблемой: в отчёте на первой странице определён текстовый Watermark:

Код: Выделить всё

    <Page1>
      ...
      <Watermark Ref="445" type="Stimulsoft.Report.Components.StiWatermark" isKey="true">
        <Font>Arial,100</Font>
        <Text>Образец</Text>
        <TextBrush>[120:0:0:0]</TextBrush>
      </Watermark>
    </Page1>
В коде отчёта на событие Page1.Rendering навешен обработчик, который при выполнении определённого условия в данных этот водяной знак скрывает:

Код: Выделить всё

namespace Reports
{
    public class Report : Stimulsoft.Report.StiReport
    {
        public Report()        
        {
            this.InitializeComponent();
            this.Page1.Rendering += HideWatermark;
            ...
        }

        public void HideWatermark(object sender, System.EventArgs e)
        {
            if (...)
            {
                Page1.Watermark.Enabled = false;
                //Page1.Watermark.Text = Policy.StstusName;
            }
        }
        
        ...
    }
При рендеринге (в pdf) с 2013-й библиотекой всё отлично работает (скрывается при выполнении условия). С 2018-й библиотекой -- нет. Я так понимаю, что-то изменилось в правилах обработки событий отчёта.

Подскажите, пожалуйста,
1. что именно изменилось с 2013.2.1700 версии?
2. где теперь нужно вызывать код, динамически меняющий отчёт в зависимости от входных данных?
3. и можно ли как-то без исправления отчётов (много их) восстановить поведение как со старой версией библиотеки? Ну или хотя бы изменяя только xml, не трогая C# код.

Попробовал перенести вызов кода обработчика в конструктор отчёта, сразу после InitializeComponents();
Работает. Но требует изменения кода..

Спасибо.

P.S.
1. навешивание события на другие обработчики (BeginRender, EndRender) страницы либо всего отчёта дело не меняет;
2. так же -- навешивание события декларативно, в <Page1><RenderingEvent>;
3. какое-то динамическое изменение из обработчиков вроде бы всё же работает, например, удаётся скрывать страницы через PageN.Enabled = false.

Re: Скрытие Watermark из обработчика не работает после обновления 2013 -> 2018

Добавлено: 16 сен 2018, 04:35
Ivan
Здравствуйте.
Подскажите, пожалуйста,
1. что именно изменилось с 2013.2.1700 версии?
Если мы правильно определили причину проблемы - изменился порядок вызова некоторых событий рендеринга на более логичный.
В основном это делалось для того, чтобы в разных событиях можно было корректно получить номер страницы.
Например, событие Page.Rendering ранее вызывалось до создания новой страницы, теперь уже после создания.
Соответственно, если вы в событии Page.Rendering выключали Watermark именно в странице шаблона, то ранее это влияло уже на первую страницу, теперь начиная со второй.
2. где теперь нужно вызывать код, динамически меняющий отчёт в зависимости от входных данных?
Для страницы первым событием всегда вызывается BeforePrint.
3. и можно ли как-то без исправления отчётов (много их) восстановить поведение как со старой версией библиотеки? Ну или хотя бы изменяя только xml, не трогая C# код.
Специально на этот случай мы сделали свойство для включения старого порядка вызова этого события:

Код: Выделить всё

StiOptions.Engine.FixPageNumberInEvents = false;
Спасибо.

Re: Скрытие Watermark из обработчика не работает после обновления 2013 -> 2018

Добавлено: 17 сен 2018, 22:09
Артём
Да, всё верно.
Всё работает, если цепляться к Page.BeforePrint, или к this.BeginRender, или установить FixPageNumberInEvents = false.

Большое спасибо!

Re: Скрытие Watermark из обработчика не работает после обновления 2013 -> 2018

Добавлено: 18 сен 2018, 10:00
HighAley
Здравствуйте, Артём.

Мы всегда рады вам помочь.
Обращайтесь, если ещё надо помощь.

Спасибо.