Возможна ли группировка в динамическом отчёте

Обсуждение Stimulsoft Reports.NET
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Возможна ли группировка в динамическом отчёте

Сообщение Jan »

Здравствуйте,

В момент вызова события BeforePrintEvent, значение текстового поля еще не расчитано. Лучше использовать событие GetValue. Значение поля будет находится в e.Value.

Спасибо.
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

Jan, подскажи как это реализовать :)
Написал так, т.е. добавляю обработчик при создании

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

double posic = 0;
            for (int i = intCountGroup + 1; i < dt.Columns.Count; i+=2)
            {
                StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
                groupHeaderBand.Name = "GroupHeader" + intNameText.ToString();
                groupHeaderBand.CanShrink = true;   //Может сжиматься, если пустой
                groupHeaderBand.Height = 0.4;
                groupHeaderBand.Condition.Value = "{data." + dt.Columns[i].ColumnName + "}";
                page.Components.Add(groupHeaderBand);
                // TextGroup - значение первого столбца на заголовок группировки
                StiText TextGroup;
                TextGroup = new Stimulsoft.Report.Components.StiText();
                TextGroup.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, page.Width + 0.2, 0.4);//- posic 
                TextGroup.Name = "TextGroupHeader" + i.ToString();

                TextGroup.Text.Value = "{data." + dt.Columns[i - 1].ColumnName + "}";
                TextGroup.Border.Side = StiBorderSides.All;
                TextGroup.Enabled = false;  //Невидимый элемент
                TextGroup.GetValue += new Stimulsoft.Report.Events.StiGetValueEventHandler(Text_Conditions);
                
                groupHeaderBand.Components.Add(TextGroup);

                intNameText++;
                posic += douStep;
            }
, но в методе Text_Conditions(), на точку останова реакции нет никакой :sweat:
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Возможна ли группировка в динамическом отчёте

Сообщение Jan »

Здравствуйте,

Этот код вызван после компиляции отчета?

Спасибо.
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

Нет, после :feelgood:
Я понял, Jan, что необходимо присваивать обработчик после компиляции отчёта.
Я так и сделал, но в событие не попадаю :dumb:
Вот код:

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

report.Compile();

            for (int i = 0; i < arlNameTextGroup.Count; i++)
            {
                StiText TextGroup1 = report.GetComponents()[arlNameTextGroup[i].ToString()] as StiText;
                TextGroup1.GetValue += new Stimulsoft.Report.Events.StiGetValueEventHandler(Text_Conditions);
            }

            report.Show();
Так попадает, но это BeforePrint событие:

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

 report.Compile();

            for (int i = 0; i < arlNameTextGroup.Count; i++)
            {
                report.CompiledReport.GetComponents()[arlNameTextGroup[i].ToString()].BeforePrint += new EventHandler(Text_Conditions);
            }

            report.Show();
Как мне верно сделать?
Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Возможна ли группировка в динамическом отчёте

Сообщение Jan »

Здравствуйте,

Есть небольшая разница между первым и вторым примером кода:

report.GetComponents()


report.CompiledReport.GetComponents()

В данном случае правильным будет второй.

Спасибо.
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

Спасибо, Jan - отладчик остановился в событии :biggrin:
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

Jan, возник следующий вопрос, при:

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

TextGroup.Enabled = false;  //Невидимый элемент
Событие GetValue у компонента - непроисходит :(
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Возможна ли группировка в динамическом отчёте

Сообщение Jan »

Здравствуйте,

В данном случае поведение генаратора отчетов верное. Какая логика? Происходит построение компонента. Генерируется событие BeforePrint. Событие генерируется в независимости от состояния свойства Enabled, для того, чтобы можно было изменить свойство Enabled компонента. Если Enabled свойство после события BeforePrint равно true, то начинается процесс генерации нового компонента, в том числе с вызовом события GetValue (для новосозданного компонента). В конце построения вызвается событие AfterPrint. Это событие вызвается в любом случае, в независимости от состояния свойства Enabled.

Спасибо.
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

Спасибо, Jan, получилось :biggrin:

Сделал так:

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

//После компиляции (а это важно), присваиваем события текстовым компонентам группировкам
            report.Compile();
            for (int i = 0; i < arlNameTextHeaderGroup.Count; i++)
            {
                StiText TextGroupHeaderEvent = report.CompiledReport.GetComponents()[arlNameTextHeaderGroup[i].ToString()] as StiText;
                TextGroupHeaderEvent.GetValue += new  Stimulsoft.Report.Events.StiGetValueEventHandler(Text_Conditions_GroupHeaderBand);
            }



        private void Text_Conditions_GroupHeaderBand(object sender, Stimulsoft.Report.Events.StiGetValueEventArgs e)
        {//Обработчик события отображения/неотображения заголовков названий группировки
            if (e.Value != "".ToString().ToLower())
                ((StiComponent)(sender)).Enabled = true;
            else
                ((StiComponent)(sender)).Enabled = false;
        }
Сделал, теперь наименования заголовка и подвала группы не видны при пустом значении.
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

Возможна ли группировка в динамическом отчёте

Сообщение Master »

А вот и следующий вопрос :) У меня на GroupFooter есть текстовые компоненты, которые подбивают сумму столбцов, как мне их скрывать в зависимости от видимости заголовка подвала?
Спасибо.
Код формирования подвала таков:

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

            string[] arSummColumn = pstrSummColumn.Split('|');
            for (int i = dt.Columns.Count - 1; i >= intCountGroup + 1; i -= 2)
            {
                //Create GroupHeaderBand - группировка по первому столбцу
                StiGroupFooterBand groupFooterBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupFooterBand) as StiGroupFooterBand;
                groupFooterBand.Name = "GroupFooter" + intNameText.ToString();
                groupFooterBand.CanShrink = true;   //Может сжиматься, если пустой
                groupFooterBand.Height = 0.4;
                page.Components.Add(groupFooterBand);

                StiText TextGroupFooter;
                TextGroupFooter = new Stimulsoft.Report.Components.StiText();
                TextGroupFooter.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, page.Width + 0.2, 0.4);
                TextGroupFooter.Name = "TextGroupFooter" + intNameText.ToString();

                arlNameTextFooterGroup.Add(TextGroupFooter.Name);

                TextGroupFooter.Text.Value = STR_ITOG + "{data." + dt.Columns[i - 1].ColumnName + "}";
                TextGroupFooter.Border.Side = StiBorderSides.All;
                TextGroupFooter.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 204);

                groupFooterBand.Components.Add(TextGroupFooter);
                
                intNameText++;

                if (pstrSummColumn.Length > 0)//Если в модуль переданы столбцы по которым надо произвести сложение
                {
                    double posicSumm = 0;
                    for (int ii = 0; ii = arPosColumn.Length)//Проверка диапазона
                        {
                            MessageBox.Show("Переданные параметр, столбца по которому необходимо подбить сумму выходит за приемлемый диапазон.", "Неправильно передан параметр.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }

                        posicSumm = arPosColumn[number - 1];
                        StiText TextGroupFooterSumm;
                        TextGroupFooterSumm = new Stimulsoft.Report.Components.StiText();
                        TextGroupFooterSumm.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(posicSumm, 0, columnWidth, 0.4);
                        TextGroupFooterSumm.Name = "TextGroupFooter" + intNameText.ToString();
                        TextGroupFooterSumm.Text.Value = "{Sum(data." + dt.Columns[number].ColumnName + ")}";
                        TextGroupFooterSumm.Border.Side = StiBorderSides.All;

                        groupFooterBand.Components.Add(TextGroupFooterSumm);
                        intNameText++;
                    }
                }
            }
Вложения
Summ.JPG
Summ.JPG (37.37 КБ) 6109 просмотров
Ответить