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

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 05 апр 2009, 12:51
AID
Здравствуйте! Подскажите, пожалуйста!
Написал класс отчета, который принимает в конструкторе ссылку на таблицу и распечатывает ее. Проблема: не могу присвоить элементам StiText свойство Text.Value. Запускаю отчет - а все созданные StiText'ы пустые (незаполненные). Вот код (общая идеология взята из примера PrintTable документации):

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

    public class ReportChartMini : Stimulsoft.Report.StiReport
    {
        private DataTable _dataTable;

        public ReportChartMini(DataTable dataTable)
        {
            this._dataTable = dataTable;
            
            this.InitReport();

            this.PrintTable();
        }

        private void PrintTable()
        {
            StiReport report = this;
            
            report.RegData("data", _dataTable);

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

			StiPage page = report.Pages[0];

			//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;
            int nameIndex = 0;

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

			foreach (DataColumn dataColumn in _dataTable.Columns)
			{
				StiText dataText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5));
				
                dataText.Text.Value = "foo_text"; //ВОТ ТУТ ЧТО_ТО НЕ ТАК
                //dataText.Text.Value = "{TotalPageCount}"; //если так - все равно отображается StiText без текста

                dataText.Name = "DataText" + nameIndex.ToString();
				dataText.Border.Side = StiBorderSides.All;
				dataBand.Components.Add(dataText);

				pos = pos + columnWidth;
                nameIndex++;
			}
        }
    }
Однако если написать:

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

dataText.GetValue += new Stimulsoft.Report.Events.StiGetValueEventHandler(TextInfo__GetValue);
и добавить обрабтчик

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

        public void TextInfo__GetValue(object sender, Stimulsoft.Report.Events.StiGetValueEventArgs e)
        {
            e.Value = "foo_text from GetValue";
        }
то все работает. Но меня не устравает такой подход ((( хочется задавать текст прямо в цикле, что я делаю неправильно?

В идеале вообще должно быть примерно так:

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

dataText.Text.Value = "{data." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols(dataColumn.ColumnName) + "}";
Само собой, к dataColumn я могу обратиться только из цикла.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 05 апр 2009, 17:52
Ivan
Здравствуйте.
AID писал(а):Подскажите, пожалуйста!
Написал класс отчета, который принимает в конструкторе ссылку на таблицу и распечатывает ее. Проблема: не могу присвоить элементам StiText свойство Text.Value. Запускаю отчет - а все созданные StiText'ы пустые (незаполненные).
Надо присваивать значение самому свойству Text, которое имеет тип StiExpression ("выражение"). Свойство Text.Value рассчитывается при рендеринге отчета, это результат вычисления свойства Text. Так как у вас само свойство Text не присваивается, то и после рендеринга все StiText-ы получаются пустыми.

Спасибо.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 05 апр 2009, 18:25
Jan
Здравствуйте,

Проблема в том в каком состоянии находится отчет. Он может находится в двух состояниях: некомпилированный отчет (все выражения в виде текста, все события в виде текста) и в скомпилированном (все выражения в виде методов, все события в виде методов). Скорей всего Вы не вызваете компиляцию отчета перед построением. Поэтому Text.Value не работает (нет метода который вернет значение), но можно подписаться на события.

Спасибо.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 06 апр 2009, 13:01
AID
Скажите пожалуйста, а как вызвать компиляцию отчета перед построением?

Вот код метода InitReport

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

        private void InitReport()
        {
            this.NeedsCompiling = false;
            this.EngineVersion = Stimulsoft.Report.Engine.StiEngineVersion.EngineV2;
            this.ReferencedAssemblies = new System.String[] {
                    "System.Dll",
                    "System.Drawing.Dll",
                    "System.Windows.Forms.Dll",
                    "System.Data.Dll",
                    "System.Xml.Dll",
                    "Stimulsoft.Controls.Dll",
                    "Stimulsoft.Base.Dll",
                    "Stimulsoft.Report.Dll"};
            this.ReportAlias = "Report";
            // 
            // ReportChanged
            // 
            this.ReportChanged = new DateTime(2009, 4, 3, 23, 11, 29, 0);
            // 
            // ReportCreated
            // 
            this.ReportCreated = new DateTime(2009, 4, 3, 22, 16, 58, 0);
            this.ReportName = "Report";
            this.ReportUnit = Stimulsoft.Report.StiReportUnitType.Centimeters;
            this.ScriptLanguage = Stimulsoft.Report.StiReportLanguageType.CSharp;
        }
Когда я поменял значение поля NeedsCompiling на true, отчет при вызове метода Render() стал выбрасывать исключение вида:

ReportChartMini: c:\TEMP\nkqee0mf.0.cs(17,16) : error CS1501: No overload for method 'ReportChartMini' takes '0' arguments
A first chance exception of type 'System.Exception' occurred in Stimulsoft.Report.dll

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 06 апр 2009, 13:05
Jan
Здравствуйте,

Report.Compile();

Спасибо.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 06 апр 2009, 16:30
AID
В конструкторе отчета, вызываю метод Compile() перед вызовом PrintTable()

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

        public ReportChartMini(DataTable dataTable)
        {
            this._dataTable = dataTable;
            
            this.InitReport();

            this.Compile();

            this.PrintTable();
        }
Получаю эксепшн:
A first chance exception of type 'System.Exception' occurred in Stimulsoft.Report.dll

Additional information: Report already compiled

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 06 апр 2009, 17:15
Jan
Здравствуйте,

Измените вот эту строку:

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

 this.NeedsCompiling = false;
на

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

 this.NeedsCompiling = true;
Спасибо.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 07 апр 2009, 06:15
AID
Так и сделал :dumb:
Теперь получаю эксепшн при вызове this.Compile():
A first chance exception of type 'System.Exception' occurred in Stimulsoft.Report.dll

Additional information: c:\TEMP\9z1nhh4d.0.cs(17,16) : error CS1501: No overload for method 'ReportChartMini' takes '0' arguments

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

        public ReportChartMini(DataTable dataTable)
        {
            this._dataTable = dataTable;

            this.InitReport();

            this.Compile();  //вот тут
         
            this.PrintTable();
        }

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 07 апр 2009, 13:24
Jan
Здравствуйте,
AID писал(а):Так и сделал :dumb:
Теперь получаю эксепшн при вызове this.Compile():
A first chance exception of type 'System.Exception' occurred in Stimulsoft.Report.dll

Additional information: c:\TEMP\9z1nhh4d.0.cs(17,16) : error CS1501: No overload for method 'ReportChartMini' takes '0' arguments

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

        public ReportChartMini(DataTable dataTable)
        {
            this._dataTable = dataTable;

            this.InitReport();

            this.Compile();  //вот тут
         
            this.PrintTable();
        }
Извините сразу не обратил внимание на то, что Вы делаете наследника от класса отчета и в нем строите отчет. Компиляция здесь не поможет поскольку отчет уже собран. Работать будет только через подписывание к событию GetValue.

Спасибо.

Распечатать таблицу в динамически создаваемом отчете

Добавлено: 07 апр 2009, 17:45
AID
Благодарю. Т.е. наследоваться от отчета не рекомендуется?