Ejemplo n.º 1
0
        public DataSet PrepareTable()
        {
            if (Body == null)
            {
                return(null);
            }
            var logger = Managers.PrintingManager.Logger;

            logger.LogVerbose(Message.Common_DebugCall);
            var ds         = new DataSet();
            var bodyTables = new List <Table>();

            foreach (var baseTableHolder in Body)
            {
                bodyTables.AddRange(baseTableHolder.GetTables(s_parser));
            }
            int tableNumber = 0;

            foreach (var bodyTable in bodyTables)
            {
                DataTable data  = ds.Tables.Add(tableNumber.ToString());
                DataTable props = ds.Tables.Add("C" + tableNumber);
                props.Columns.Add(ServiceTableColumns.Name, typeof(string));
                props.Columns.Add(ServiceTableColumns.Width, typeof(int));
                props.Columns.Add(ServiceTableColumns.FontSize, typeof(string));
                props.Columns.Add(ServiceTableColumns.IsBold, typeof(bool));
                props.Columns.Add(ServiceTableColumns.IsItalic, typeof(bool));
                props.Columns.Add(ServiceTableColumns.Align, typeof(LineAlign));
                int dataColumnCount = 0; // количество столбцов данных
                int overallWidth    = 0; // общая ширина
                int zeroedCount     = 0; // количество столбцов с неуказанной шириной
                int widthCorrection = 0; // флаг (и размер) необходимости коррекции ширин если превысили 100%
                int zeroedWidth     = 0; // размер, рассчитанный для столбцов с неуказанной шириной
                foreach (ColDefinition prop in bodyTable.Columns)
                {
                    int colCount = 1;
                    if (prop.Count != null)
                    {
                        if (!Int32.TryParse(s_parser.GetVariable(prop.Count).ToString(), out colCount))
                        {
                            colCount = 1;
                        }
                    }
                    if (prop.Width > 0)
                    {
                        overallWidth += (prop.Width * colCount);
                    }
                    else
                    {
                        zeroedCount += 1 * colCount;
                    }
                }
                if (zeroedCount > 0)
                {
                    zeroedWidth = (int)((100.0 - overallWidth) / zeroedCount);
                }
                if (overallWidth > 100)
                {
                    widthCorrection = (int)(100.0 / bodyTable.Columns.Length);
                }
                foreach (ColDefinition prop in bodyTable.Columns)
                {
                    int colCount = 1;
                    if (prop.Count != null)
                    {
                        if (!Int32.TryParse(s_parser.GetVariable(prop.Count).ToString(), out colCount))
                        {
                            colCount = 1;
                        }
                    }
                    for (int i = 0; i < colCount; i++)
                    {
                        DataRow dr = props.NewRow();
                        dr[ServiceTableColumns.Name] = "S" + dataColumnCount;
                        if (widthCorrection > 0)
                        {
                            dr[ServiceTableColumns.Width] = widthCorrection;
                        }
                        else
                        {
                            if (prop.Width > 0)
                            {
                                dr[ServiceTableColumns.Width] = prop.Width;
                            }
                            else
                            {
                                dr[ServiceTableColumns.Width] = zeroedWidth;
                            }
                        }
                        dr[ServiceTableColumns.FontSize] = prop.FontSize;
                        dr[ServiceTableColumns.IsBold]   = prop.IsBold;
                        dr[ServiceTableColumns.IsItalic] = prop.IsItalic;
                        if (prop.Align.HasValue)
                        {
                            dr[ServiceTableColumns.Align] = prop.Align;
                        }
                        else
                        {
                            dr[ServiceTableColumns.Align] = DBNull.Value;
                        }
                        props.Rows.Add(dr);
                        data.Columns.Add("S" + dataColumnCount, typeof(string));
                        dataColumnCount++;
                    }
                }
                data.Columns.Add(ServiceTableColumns.FontSize, typeof(int));
                data.Columns.Add(ServiceTableColumns.IsBold, typeof(bool));
                data.Columns.Add(ServiceTableColumns.IsItalic, typeof(bool));
                data.Columns.Add(ServiceTableColumns.ServiceMode, typeof(ServiceMode));
                data.Columns.Add(ServiceTableColumns.IsTableDotted, typeof(bool));
                data.Columns.Add(ServiceTableColumns.Align, typeof(LineAlign));
                Lines lines = bodyTable.Lines;
                foreach (IReportElement line in lines)
                {
                    if (line.IsPrintable)
                    {
                        var     repLine = (ReportLine)line;
                        DataRow dr      = data.NewRow();
                        for (int index = 0; index < dataColumnCount; index++)
                        {
                            dr["S" + index] = repLine.Lines.Length > index ? repLine.Lines[index] : " ";
                        }
                        dr[ServiceTableColumns.FontSize]    = repLine.FontSize(FontSize);
                        dr[ServiceTableColumns.IsBold]      = repLine.Bold;
                        dr[ServiceTableColumns.IsItalic]    = repLine.Italic;
                        dr[ServiceTableColumns.ServiceMode] = repLine.Mode;
                        var lineDotted = repLine.IsLineDotted < 0
                                             ? bodyTable.IsDotted
                                             : Convert.ToBoolean(repLine.IsLineDotted);
                        dr[ServiceTableColumns.IsTableDotted] = lineDotted;
                        dr[ServiceTableColumns.Align]         = repLine.Align;
                        data.Rows.Add(dr);
                    }
                }
                tableNumber++;
            }
            logger.LogVerbose(Message.Common_DebugReturn);
            return(ds);
        }