// Закомментил старое /*protected override void WriteColumns(tablelayoutClass LayoutProfile, XslFOProfileWriter RepGen, DataTable oTable, LayoutColumns Columns, ReportParams Params, object CustomData, IDictionary Vars) * { * base.WriteColumns(LayoutProfile, RepGen, oTable, Columns, Params, CustomData, Vars); * * // создаем копию существующих столбцов * // для накопления общих итогов только по помеченным строкам * m_TotalColumns = cloneLayoutColumns(Columns); * } */ /// <summary> /// Вычисляет данные ячейки таблицы лэйаута /// </summary> /// <remarks>Переопределяем стандартный метод</remarks> protected override ReportFormatterData CalculateCellValue(ReportLayoutData LayoutData, TableLayout.LayoutColumns Columns, int RowNum, int ColumnNum, DataRow CurrentRow, int RowSpan) { // значение в ячейке object CurrentValue = null; // получаем объект, с которым работают форматтеры и эвалуаторы ReportFormatterData FormatterData = new ReportFormatterData( LayoutData, CurrentValue, null, CurrentRow, RowNum, ColumnNum); if (string.Empty == Columns[ColumnNum].RSFileldName) // если текущее значение не соответсвует никакой колонке рекордсета { if (Columns[ColumnNum].ColumnIsCounter) // если колонка - счетчик { // текущее значение счетчика CurrentValue = Columns[ColumnNum].CounterCurrent.ToString(); // инкрементируем счетчик Columns[ColumnNum].IncrementCounter(); } else // null иначе { CurrentValue = null; } } else // значение { CurrentValue = new Croc.XmlFramework.ReportService.Utility.MacroProcessor(FormatterData).Process(Columns[ColumnNum].RSFileldName); } // Encoding if (Columns[ColumnNum].Encoding == encodingtype.text) { CurrentValue = System.Web.HttpUtility.HtmlEncode(CurrentValue.ToString()); } FormatterData.CurrentValue = CurrentValue; // проходим по эвалуаторам и форматтерам if (Columns[ColumnNum].Formatters != null) { foreach (abstractformatterClass FormatterNode in Columns[ColumnNum].Formatters) { if (!FormatterNode.useSpecified || FormatterNode.use != usetype.totalcell) { // просим объект у фабрики IReportFormatter Formatter = (IReportFormatter)ReportObjectFactory.GetInstance(FormatterNode.GetAssembly(), FormatterNode.GetClass()); // делаем что-то Formatter.Execute(FormatterNode, FormatterData); } } } if (string.Empty != Columns[ColumnNum].AggregationFunction) { Columns[ColumnNum].UpdateTotals(CurrentValue); // проапдейтим итоги по помеченным строкам bool bNoTotals; try { // берем из строки рекорсета столбец NoTotals bNoTotals = Convert.ToBoolean(CurrentRow[NOTOTALS_COLUMN_NAME]); } catch (Exception) { // если, что-то пошло не так, считаем, что нужно // пересчитывать итоги (как обычно) bNoTotals = false; } // пересчитаем итоги, если нужно if (!bNoTotals) { TotalColumns[ColumnNum].UpdateTotals(CurrentValue); } } if (FormatterData.ClassName == null || FormatterData.ClassName == string.Empty) { FormatterData.ClassName = Columns[ColumnNum].CellCssClass; } return(FormatterData); }