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

Обсуждение Stimulsoft Reports.NET
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

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

Сообщение Master »

Добрый день :biggrin:

Подскажите пожалуйста, можно ли делать группировку в динамическом отчёте.
Например в примере PrintTable сделать группировку?
Если это возможно, приведите пожалуйста маленький кусочек кода.

Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

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

Сообщение Jan »

Здравствуйте,
Подскажите пожалуйста, можно ли делать группировку в динамическом отчёте.
Например в примере PrintTable сделать группировку?
Можно. Ниже пример кода:

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

StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
						groupHeaderBand.Name = "GroupHeader1";
						groupHeaderBand.Height = AlignToMaxGrid(page, 30, true);
						groupHeaderBand.Condition.Value = "{condition}";
						page.Components.Add(groupHeaderBand);

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

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

Сообщение Master »

Подскажите пожалуйста, что такое: AlignToMaxGrid.
Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

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

Сообщение Jan »

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

Запишите так:

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

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

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

Сообщение Master »

Вот исходный код модуля печати FlexGrida, с возможностью вывода заголовка и итога.

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

    class PrintTable
    {
         
        static public void ShowReport(string strTitle, C1FlexGrid fg, string strSummary)
        {
            StiReport report = new StiReport();
            
            //Создаём и копируем ресурсную таблицу у FlexGrid во временную DataTable вывода на экран
            DataTable dt = new DataTable();
            DataTable dtDS = (DataTable)fg.DataSource;
            dt = dtDS.Copy();
            
            //Удаляем из временной DataTable столбцов, которые скрыты во FlexGrid
            int intDelCol = 0;  //Количесво удалённых ячеек
            for (int intCol = 0; intCol < dt.Columns.Count + intDelCol; intCol++)
            {
                int intColFlex = intCol + 1;

                //if (dt.Columns[intCol - intDelCol].ColumnName != fg[0, intCol + 1].ToString())
                //    dt.Columns[intCol - intDelCol].ColumnName = fg[0, intCol + 1].ToString();

                if (intColFlex <= fg.Cols.Count)
                    if (fg.Cols[intColFlex].Visible == false)
                    {
                        string str = dt.Columns[intCol - intDelCol].ColumnName;
                            //fg[0, intCol + 1].ToString();
                        dt.Columns.Remove(str);
                        intDelCol++;    //Увеличиваем кол-во удалённых ячеек
                    }
            }

            

            //Add data to datastore
            report.RegData("data", dt);

            //Fill dictionary
            report.Dictionary.Synchronize();
            report.Dictionary.DataSources[0].Name = "data";
            report.Dictionary.DataSources[0].Alias = "data";

            StiPage page = report.Pages[0];

            //Создаём заголовок отчёта
            // 
            // ReportTitle1
            // 
            StiReportTitleBand reportTitle;
            reportTitle = new StiReportTitleBand();
            reportTitle.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0.4, 19, 0.8);
            reportTitle.Name = "ReportTitle1";
            page.Components.Add(reportTitle);
            // 
            // TextTitle
            //
            StiText textTitle;
            textTitle = new StiText();
            textTitle.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, 19, 0.8);
            textTitle.DockStyle = Stimulsoft.Report.Components.StiDockStyle.Fill;
            textTitle.Name = "TextTitle";
            textTitle.Text.Value = strTitle;
            textTitle.HorAlignment = StiTextHorAlignment.Center;
            reportTitle.Components.Add(textTitle);

            //Create HeaderBand
            StiHeaderBand headerBand = new StiHeaderBand();
            headerBand.Height = 0.5;
            headerBand.Name = "HeaderBand";
            page.Components.Add(headerBand);

            //Create HeaderBand
            StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
            groupHeaderBand.Name = "GroupHeader1";
            //groupHeaderBand.Height = AlignToMaxGrid(page, 30, true);
            groupHeaderBand.Height = 1;
            groupHeaderBand.Condition.Value = "{data." + dt.Columns[0].ColumnName + "}";
            page.Components.Add(groupHeaderBand);

            //Create Databand
            StiDataBand dataBand = new StiDataBand();
            dataBand.DataSourceName = "data";
            dataBand.Height = 0.5;
            dataBand.Name = "DataBand";
            page.Components.Add(dataBand);

            //Create texts
            double pos = 0;

            double columnWidth = StiAlignValue.AlignToMinGrid(page.Width / dt.Columns.Count, 0.1, true);

            int nameIndex = 1;
            int intColumnViewFlex = 1;  //Переменная для указания тех столбцов, которые отображены в гриде

            foreach (DataColumn dataColumn in dt.Columns)
            {
                //Create text on header
                StiText headerText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));
                
                while (fg.Cols[intColumnViewFlex].Visible == false)
                {//Мотаем номер столбца, до тех пор, пока не встретим видимый :)
                    intColumnViewFlex++;
                }
                headerText.Text.Value = fg[0, intColumnViewFlex].ToString();//dataColumn.Caption;

                headerText.HorAlignment = StiTextHorAlignment.Center;
                headerText.Name = "HeaderText" + nameIndex.ToString();
                //headerText.Brush = new StiSolidBrush(Color.LightGreen);
                headerText.Border.Side = StiBorderSides.All;
                headerBand.Components.Add(headerText);

                //Create text on Data Band
                StiText dataText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));
                dataText.Text.Value = "{data." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName) + "}";
                dataText.Name = "DataText" + nameIndex.ToString();
                dataText.Border.Side = StiBorderSides.All;

                dataBand.Components.Add(dataText);

                pos = pos + columnWidth;

                nameIndex++;
                intColumnViewFlex++;
            }

            //Создаём итог отчёта
            // 
            // ReportSummary1
            // 
            StiReportSummaryBand ReportSummary1;
            ReportSummary1 = new Stimulsoft.Report.Components.StiReportSummaryBand();
            ReportSummary1.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, columnWidth, 19, 0.8);
            ReportSummary1.Name = "ReportSummary1";
            page.Components.Add(ReportSummary1);
            // 
            // TextSummary
            //
            StiText textSummary;
            textSummary = new StiText();
            textSummary.ClientRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, 19, 0.8);
            textSummary.DockStyle = Stimulsoft.Report.Components.StiDockStyle.Fill;
            textSummary.Name = "textSummary";
            textSummary.Text.Value = strSummary;
            textSummary.HorAlignment = StiTextHorAlignment.Center;
            ReportSummary1.Components.Add(textSummary);



            //Render without progress bar
            report.Render(false);
            report.Show();
        }
    }
Подскажите пожалуйста, что я неверно вставил в группировке, происходит просто сортировка по 1-ому столбцу. Если в первый столбец заполнен значениями 1,2,3,4, то мне необходимо чтобы шёл заголовок, например "1" и под ним таблица, начиная со второго столбца, далее "2" и таблица начиная со второго столбца.
Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

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

Сообщение Jan »

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

А сама группировка выводится?

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

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

Сообщение Master »

Спасибо большое, Jan, я разобрался :)
Master
Сообщения: 39
Зарегистрирован: 08 апр 2009, 05:10

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

Сообщение Master »

Добавляю группировку так:

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

            double posic = 0;
            for (int i = intCountGroup + 1; i < dt.Columns.Count; i+=2)
            {
                //Create GroupHeaderBand - группировка по первому столбцу
                StiGroupHeaderBand groupHeaderBand = StiActivator.CreateObject(StiOptions.Designer.ComponentsTypes.Bands.GroupHeaderBand) as StiGroupHeaderBand;
                groupHeaderBand.Name = "GroupHeader" + i.ToString();
                groupHeaderBand.CanShrink = true;   //Может сжиматься, если пустой
                //groupHeaderBand.Height = 0.5;
                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(posic, 0, 19 - posic, 0.5);
                TextGroup.Name = "TextGroup" + i.ToString();
                TextGroup.Text.Value = "{data." + dt.Columns[i - 1].ColumnName + "}";
                TextGroup.Border.Side = StiBorderSides.All;
                
                TextGroup.Enabled = false;  //Невидимый элемент
                TextGroup.BeforePrint += new System.EventHandler(Text5_Conditions);

                groupHeaderBand.Components.Add(TextGroup);

                posic +=0.3;
            }
Всё работает, вот только обработчик события не вызываеться :dumb: Не заходит на точку останова.
Код обработчика:

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

private void Text5_Conditions(object sender, System.EventArgs e)
        {
            string str = ((Stimulsoft.Report.Components.StiText)(sender)).Text.Value.ToString().ToLower();
            if ( str != "".ToString().ToLower())
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Red);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Transparent);
                ((Stimulsoft.Report.Components.IStiFont)(sender)).Font = new System.Drawing.Font("Arial", 8F);
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
                return;
            }
        }
В чём причина?
Суть обработчика - сделать группировку видимой, если поле заголовка группировки не пустое.
Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

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

Сообщение Jan »

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

В случае с событиями важен момент в который происходит создание бэнда. Если отчет уже скомпилирован, то Ваш код будет работать. Но в данном случае код отчета еще не скомпилирован. Соотвественно, Вам нужно не подписываться к событию, а записать текст события в comp.BeforePrintEvent.Value.

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

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

Сообщение Master »

Jan, прочитал в хелпе и сделал так:

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

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

            //Render without progress bar
            report.Render(false);
            report.Show();
Заходит в событие ровно 11 раз (сколько и тестовых полей группировки), но значение текстовых переменных всё время равно "". Может значение их позже инициализируеться?
Спасибо большое за заботу, Jan.
Ответить