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

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 27 окт 2011, 16:50
finn
День али ночь добрые!
Провозившись с поиском, но так и не найдя ответа, решил создать топик.
Суть задачи: на шарпе написан проект WinForms, из-под него запускаю отчет. В отчете кросс-таблица, которая на дата-бэнде.
Мне необходимо в каждой печатаемой кросс-таблице менять стиль заголовка и стиль ячеек. Делать это нужно в приложении.
Решил, что буду создавать программно стили отчета (верная ли логика?), а на событии BeforePrint менять стиль.
Подобное не получилось, поэтому я начал с простейшего: пытаюсь во время BeforePrint изменить текст какой-либо ячейки. Не получается, значения не меняются. Пробовал и с ячейками, и с заголовками.
Привожу кусок кода, что я делаю не так?

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

report.Compile();
Stimulsoft.Report.Components.StiComponent component = report.CompiledReport.GetComponentByName("CrossTab1_Row1");
component.BeforePrint += new EventHandler(BeforePrint);
report.Show();

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

public void  BeforePrint(Object sender,EventArgs e)
 {
            Stimulsoft.Report.CrossTab.StiCrossHeader tab = (Stimulsoft.Report.CrossTab.StiCrossHeader)sender;
            tab.SetText("Стиль" + styleNum.ToString());
            styleNum++;
        }
Стимулсофт 2010.1 Ultimate
Спасибо.

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 28 окт 2011, 13:25
Ivan
Здравствуйте.

Нам понадобится дополнительное время для подготовки ответа на ваш вопрос.

Спасибо.

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 31 окт 2011, 05:52
Ivan
Здравствуйте.
finn писал(а): ... я начал с простейшего: пытаюсь во время BeforePrint изменить текст какой-либо ячейки. Не получается, значения не меняются. Пробовал и с ячейками, и с заголовками.
При компиляции отчета для каждого текстбокса создается отдельный метод TexBoxN_GetValue(), в котором и вычисляется его значение. Значение свойства Text в скомпилированном отчете не используется и не хранится.
finn писал(а):Решил, что буду создавать программно стили отчета (верная ли логика?), а на событии BeforePrint менять стиль.
Решение нормальное. Для изменения стиля вы можете использовать следующий код, например:

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

StiStyle style1 = new StiStyle();
style1.Brush = new StiSolidBrush(Color.FromArgb(255, 0, 255, 0));  //green
style1.SetStyleToComponent(Textbox1);
style1.SetStyleToComponent(CrossTab1_Column1_Title);
Пример отчета прикреплен к этому топику.

Спасибо.

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 31 окт 2011, 14:31
finn
Спасибо, попробую! :matrix:

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 01 ноя 2011, 02:48
Andrew
Здравствуйте.

Будет здорово, если дадите знать о результатах.

Спасибо.

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 08 ноя 2011, 15:25
finn
Спасибо, все получилось.
Пришлось, конечно, в отладке посидеть, классы объектов понаблюдать, дабы понять, что к чему приводить:))))
Привожу участки кода, возможно, кому-либо понадобится.
Суть задачи вот в чем: в базе в виде дерева хранятся объявления, там же хранятся настройки для отображения (шрифт, цвет) каждой рубрики отдельно.
Соответственно, дерево отображаем кросс-таблицей, каждая кросс-таблица на отдельном бэнде (рубрика объявлений). Подвешиваемся на печать каждой кросс-таблицы и меняем стиль заголовков и ячеек. Стили задаем заранее.

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

report.Load(".\\mrt\\ExpandedAdsReport.mrt");


           if (desing)
               report.Design();
           else
           {
               
               for (int i = 0; i < ((DataTable)report.DataStore["Data.RUBS"].ViewData).Rows.Count; i++)
               {
                   StiStyle style;
                   CategoryStyle cs = CategoryStyle.getStyleCaption(int.Parse(((DataTable)report.DataStore["Data.RUBS"].ViewData).Rows[i]["category_id"].ToString()));
                   if (null != cs)
                   {
                       Stimulsoft.Base.Drawing.StiSolidBrush b;                      
                       style = new StiStyle("C" + ((DataTable)report.DataStore["Data.RUBS"].ViewData).Rows[i]["category_id"].ToString());
                       style.Font = cs.Font;
                       ((Stimulsoft.Base.Drawing.StiSolidBrush)style.Brush).Color = cs.BackgroundColor;
                       ((Stimulsoft.Base.Drawing.StiSolidBrush)style.TextBrush).Color = cs.FontColor;
                       report.Styles.Add(style);
                   }
                   cs = CategoryStyle.getStyleData(int.Parse(((DataTable)report.DataStore["Data.RUBS"].ViewData).Rows[i]["category_id"].ToString()));
                   if (null != cs)
                   {
                       style = new StiStyle("D" + ((DataTable)report.DataStore["Data.RUBS"].ViewData).Rows[i]["category_id"].ToString());

                       style.Font = cs.Font;
                       ((Stimulsoft.Base.Drawing.StiSolidBrush)style.Brush).Color = cs.BackgroundColor;
                       ((Stimulsoft.Base.Drawing.StiSolidBrush)style.TextBrush).Color = cs.FontColor;
                       report.Styles.Add(style);
                   }
               }
               
               report.Compile();
               rubNo = 0;
               
               Stimulsoft.Report.Components.StiComponent component = report.CompiledReport.GetComponentByName("CrossTab1");
               component.BeforePrint += new EventHandler(BeforePrint);
               report.Show();
Обработчик при печати каждой кросс-таблицы

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

static int rubNo = 0;
        public void  BeforePrint(Object sender,EventArgs e)
        {
            Stimulsoft.Report.CrossTab.StiCrossTab tab = (Stimulsoft.Report.CrossTab.StiCrossTab)sender;
            string styleName = tab.Report.DataSources["RUBS"].Rows[rubNo]["category_id"].ToString();
            rubNo++;
            if (null == tab.Report.Styles["C" + styleName] && null == tab.Report.Styles["D" + styleName])
                return;
            StiStyle style = new StiStyle();
            
            for (int i = 0; i < tab.GetComponents().Count; i++)
            {
                if ((tab.GetComponents()[i].Name.Contains("Title")|| tab.GetComponents()[i].Name.Contains("Column")) && null != tab.Report.Styles["C" + styleName])
                {
                    style.GetStyleFromComponent(tab.GetComponents()[i], StiStyleElements.All);
                    style.Font = ((StiStyle)tab.Report.Styles["C" + styleName]).Font;
                    ((Stimulsoft.Base.Drawing.StiSolidBrush)style.Brush).Color = ((Stimulsoft.Base.Drawing.StiSolidBrush)((StiStyle)tab.Report.Styles["C" + styleName]).Brush).Color;
                    ((Stimulsoft.Base.Drawing.StiSolidBrush)style.TextBrush).Color = ((Stimulsoft.Base.Drawing.StiSolidBrush)((StiStyle)tab.Report.Styles["C" + styleName]).TextBrush).Color;
                    style.SetStyleToComponent(tab.GetComponents()[i]);
                }
                else if (null != tab.Report.Styles["D" + styleName])
                {
                    style.GetStyleFromComponent(tab.GetComponents()[i], StiStyleElements.All);
                    style.Font = ((StiStyle)tab.Report.Styles["D" + styleName]).Font;
                    ((Stimulsoft.Base.Drawing.StiSolidBrush)style.Brush).Color = ((Stimulsoft.Base.Drawing.StiSolidBrush)((StiStyle)tab.Report.Styles["D" + styleName]).Brush).Color;
                    ((Stimulsoft.Base.Drawing.StiSolidBrush)style.TextBrush).Color = ((Stimulsoft.Base.Drawing.StiSolidBrush)((StiStyle)tab.Report.Styles["D" + styleName]).TextBrush).Color;
                    style.SetStyleToComponent(tab.GetComponents()[i]);
                }

            }
        }

Менять стиль заголовка и ячеек кросс-таблицы во время BeforePrint

Добавлено: 09 ноя 2011, 02:49
Andrew
Здравствуйте.

Спасибо, что поделились опытом.