Beispiel #1
0
        /// <summary>
        /// 递归获取小计最大数据值
        /// </summary>
        /// <param name="p_total"></param>
        /// <returns></returns>
        int TotalMax(RptMtxSubtotal p_total)
        {
            int maxIndex = GetValidInt(p_total, "subtotal");

            if (p_total.SubTotals.Count > 0)
            {
                maxIndex = p_total.SubTotals.Max(itm => GetValidInt(itm, "subtotal"));
                foreach (RptMtxSubtotal total in p_total.SubTotals)
                {
                    int max = TotalMax(total);
                    if (maxIndex < max)
                    {
                        maxIndex = max;
                    }
                }
            }
            return(maxIndex);
        }
Beispiel #2
0
        protected override void ReadChildXml(XmlReader p_reader)
        {
            switch (p_reader.Name)
            {
            case "Text":
                Item.ReadXml(p_reader);
                break;

            case "Subtotal":
                if (SubTotals == null)
                {
                    SubTotals = new List <RptMtxSubtotal>();
                }
                RptMtxSubtotal sub = new RptMtxSubtotal(this);
                sub.ReadXml(p_reader);
                SubTotals.Add(sub);
                break;
            }
        }
Beispiel #3
0
 /// <summary>
 /// 获取所属层下的 类型
 /// </summary>
 /// <param name="p_levels"></param>
 /// <param name="p_row"></param>
 /// <param name="p_col"></param>
 /// <returns></returns>
 MtxRangeType GetRangeTypeByLevel(List <RptMtxLevel> p_levels, int p_row, int p_col)
 {
     foreach (RptMtxLevel level in p_levels)
     {
         if ((level.Row <= p_row && p_row < level.Row + level.RowSpan) &&
             level.Col <= p_col && p_col < level.Col + level.ColSpan)
         {
             return(MtxRangeType.Level);
         }
         RptMtxSubtotal total = GetSubtotal(level.SubTotals.ToList(), p_row, p_col);
         if (total != null)
         {
             return(MtxRangeType.Subtotal);
         }
         RptMtxSubtitle title = GetSubtitle(level.SubTitles.ToList(), p_row, p_col);
         if (title != null)
         {
             return(MtxRangeType.Subtitle);
         }
     }
     return(MtxRangeType.HeaderEmpty);
 }
Beispiel #4
0
        public override void Undo(object p_args)
        {
            SubTotalCmdArgs args   = (SubTotalCmdArgs)p_args;
            RptMtxSubtotal  total  = args.SubTotal;
            RptItemBase     parent = args.Parent;
            RptMatrix       mtx    = null;

            if (parent is RptMtxLevel)
            {
                RptMtxLevel pLevel = parent as RptMtxLevel;
                mtx = pLevel.Matrix;
                args.BackMtxRow();
                pLevel.SubTotals.Insert(args.TotalIndex, total);
            }
            else
            {
                RptMtxSubtotal pTotal = parent as RptMtxSubtotal;
                mtx = pTotal.Level.Matrix;
                args.BackMtxRow();
                pTotal.SubTotals.Insert(args.TotalIndex, total);
            }
            mtx.Update(true);
        }
Beispiel #5
0
        public override object Execute(object p_args)
        {
            SubTotalCmdArgs  args       = (SubTotalCmdArgs)p_args;
            RptItemBase      parent     = args.Parent;
            RptMtxSubtotal   total      = args.SubTotal;
            RptMtxHeaderType headerType = RptMtxHeaderType.Col;
            RptMatrix        mtx        = null;

            args.InitData();
            if (parent is RptMtxLevel)
            {
                RptMtxLevel pLevel = parent as RptMtxLevel;
                mtx = pLevel.Matrix;
                if (pLevel.Parent is RptMtxRowHeader)
                {
                    headerType = RptMtxHeaderType.Row;
                }
                DelRows(args, headerType, mtx, total);
                args.TotalIndex = pLevel.SubTotals.IndexOf(total);
                pLevel.SubTotals.Remove(total);
            }
            else
            {
                RptMtxSubtotal pTotal = parent as RptMtxSubtotal;
                mtx = pTotal.Level.Matrix;
                if (pTotal.Level.Parent is RptMtxRowHeader)
                {
                    headerType = RptMtxHeaderType.Row;
                }
                DelRows(args, headerType, mtx, total);
                args.TotalIndex = pTotal.SubTotals.IndexOf(total);
                pTotal.SubTotals.Remove(total);
            }
            mtx.Update(true);
            return(total);
        }
Beispiel #6
0
        public override object Execute(object p_args)
        {
            SubTotalCmdArgs  args       = (SubTotalCmdArgs)p_args;
            RptItemBase      parent     = args.Parent;
            RptMtxHeaderType headerType = RptMtxHeaderType.Col;
            RptMtxSubtotal   total      = args.SubTotal;
            RptMatrix        mtx        = null;

            if (total == null)
            {
                total = new RptMtxSubtotal(parent);
                args.InitData();
                if (parent is RptMtxLevel)
                {
                    RptMtxLevel pLevel = parent as RptMtxLevel;
                    mtx = pLevel.Matrix;
                    if (pLevel.Parent is RptMtxRowHeader)
                    {
                        headerType = RptMtxHeaderType.Row;
                    }
                    total.Item.Val = string.Format("subtotal{0}", mtx.GetMaxTotal());
                    int curIndex = 0;
                    if (headerType == RptMtxHeaderType.Row)
                    {
                        curIndex = pLevel.Row;
                        if (!mtx.HideRowHeader && !mtx.HideColHeader)
                        {
                            curIndex -= (mtx.Corner.Row + mtx.Corner.RowSpan);
                        }
                        args.OpsRows.Add(InsertNewRow(mtx, curIndex));
                    }
                    else
                    {
                        curIndex = pLevel.Col - mtx.Rows[0].Col;
                        foreach (RptMtxRow row in mtx.Rows)
                        {
                            args.OpsCells.Add(row, InsertNewCell(mtx, row, curIndex).ToList());
                        }
                    }
                    args.CurIndex = curIndex;
                }
                else
                {
                    RptMtxSubtotal pTotal = parent as RptMtxSubtotal;
                    mtx = pTotal.Level.Matrix;
                    if (pTotal.Level.Parent is RptMtxRowHeader)
                    {
                        headerType = RptMtxHeaderType.Row;
                    }
                    total.Item.Val = string.Format("subtotal{0}", mtx.GetMaxTotal());
                    if (pTotal.SubTotals.Count > 0)
                    {
                        int curIndex = 0;
                        if (headerType == RptMtxHeaderType.Row)
                        {
                            curIndex = pTotal.Row + pTotal.GetCount();
                            if (!mtx.HideColHeader && !mtx.HideRowHeader)
                            {
                                curIndex -= (mtx.Corner.Row + mtx.Corner.RowSpan);
                            }
                            args.OpsRows.Add(InsertNewRow(mtx, curIndex));
                        }
                        else
                        {
                            curIndex = pTotal.Col - mtx.Rows[0].Col + pTotal.GetCount();
                            foreach (RptMtxRow row in mtx.Rows)
                            {
                                args.OpsCells.Add(row, InsertNewCell(mtx, row, curIndex).ToList());
                            }
                        }
                        args.CurIndex = curIndex;
                    }
                }
            }
            else
            {
                mtx = total.Level.Matrix;
                args.BackMtxRow();
            }
            if (parent is RptMtxLevel)
            {
                (parent as RptMtxLevel).SubTotals.Add(total);
            }
            else
            {
                (parent as RptMtxSubtotal).SubTotals.Add(total);
            }
            args.SubTotal = total;
            mtx.Update(true);
            return(total);
        }
Beispiel #7
0
        public override object Execute(object p_args)
        {
            SubTotalCmdArgs args   = (SubTotalCmdArgs)p_args;
            RptMtxLevel     pLevel = args.Parent as RptMtxLevel;
            RptMtxSubtotal  total  = args.SubTotal;
            RptMatrix       mtx    = pLevel.Matrix;

            if (pLevel != null)
            {
                int count    = 0;
                int newIndex = 0;
                int index    = 0;
                if (pLevel.Parent is RptMtxRowHeader)
                {
                    args.OpsRows = total.GetRptRows(out index);
                    mtx.Rows.RemoveRange(index, args.OpsRows.Count);
                    if (total.TotalLoc == TotalLocation.Before)
                    {
                        count = (from c in pLevel.SubTotals
                                 where c.TotalLoc == total.TotalLoc &&
                                 pLevel.SubTotals.IndexOf(c) >= pLevel.SubTotals.IndexOf(total)
                                 select c).Count();
                        newIndex = pLevel.Row - count - (mtx.Row + mtx.ColHeader.RowSpan);
                    }
                    else
                    {
                        count = (from c in pLevel.SubTotals
                                 where c.TotalLoc == total.TotalLoc &&
                                 pLevel.SubTotals.IndexOf(c) < pLevel.SubTotals.IndexOf(total)
                                 select c).Count();
                        newIndex = pLevel.Row + pLevel.RowSpan + count - (mtx.Row + mtx.ColHeader.RowSpan);
                    }
                    mtx.Rows.InsertRange(newIndex, args.OpsRows);
                }
                else
                {
                    args.OpsCells = total.GetRptCells(out index);
                    foreach (RptMtxRow row in args.OpsCells.Keys)
                    {
                        row.Cells.RemoveRange(index, args.OpsCells[row].Count);
                        if (total.TotalLoc == TotalLocation.Before)
                        {
                            count = (from c in pLevel.SubTotals
                                     where c.TotalLoc == total.TotalLoc &&
                                     pLevel.SubTotals.IndexOf(c) >= pLevel.SubTotals.IndexOf(total)
                                     select c).Count();
                            newIndex = pLevel.Col - count - (mtx.Col + mtx.RowHeader.ColSpan);
                        }
                        else
                        {
                            count = (from c in pLevel.SubTotals
                                     where c.TotalLoc == total.TotalLoc &&
                                     pLevel.SubTotals.IndexOf(c) < pLevel.SubTotals.IndexOf(total)
                                     select c).Count();
                            newIndex = pLevel.Col + pLevel.ColSpan + count - (mtx.Col + mtx.RowHeader.ColSpan);
                        }
                        row.Cells.InsertRange(newIndex, args.OpsCells[row]);
                    }
                }
                args.BefIndex = index;
                args.CurIndex = newIndex;
            }
            mtx.Update(true);
            return(null);
        }
Beispiel #8
0
 /// <summary>
 /// 删除对应数据
 /// </summary>
 /// <param name="p_args"></param>
 /// <param name="p_headerType"></param>
 /// <param name="p_mat"></param>
 /// <param name="p_total"></param>
 void DelRows(SubTotalCmdArgs p_args, RptMtxHeaderType p_headerType, RptMatrix p_mat, RptMtxSubtotal p_total)
 {
     if (p_total.Parent is RptMtxLevel || (p_total.Parent as RptMtxSubtotal).SubTotals.Count > 1)
     {
         if (p_headerType == RptMtxHeaderType.Row)
         {
             int index = -1;
             List <RptMtxRow> opsRows = p_total.GetRptRows(out index);
             if (opsRows != null)
             {
                 p_args.OpsRows  = opsRows;
                 p_args.CurIndex = index;
                 p_mat.Rows.RemoveRange(index, p_total.RowSpan);
             }
         }
         else
         {
             int index = -1;
             Dictionary <RptMtxRow, List <RptText> > opsCells = p_total.GetRptCells(out index);
             if (opsCells != null)
             {
                 foreach (RptMtxRow row in opsCells.Keys)
                 {
                     row.Cells.RemoveRange(index, p_total.ColSpan);
                 }
                 p_args.CurIndex = index;
                 p_args.OpsCells = opsCells;
             }
         }
     }
 }
Beispiel #9
0
        /// <summary>
        /// 获取内部指定位置的文本
        /// </summary>
        /// <param name="p_row"></param>
        /// <param name="p_col"></param>
        /// <returns></returns>
        public RptText GetText(int p_row, int p_col)
        {
            MtxRangeType mtxType = GetRangeType(p_row, p_col);

            switch (mtxType)
            {
            case MtxRangeType.Corner:
            {
                return(Corner.Item);
            }

            case MtxRangeType.Level:
            {
                foreach (RptMtxLevel level in RowHeader.Levels)
                {
                    if ((level.Row <= p_row && p_row < level.Row + level.RowSpan) &&
                        level.Col <= p_col && p_col < level.Col + level.ColSpan)
                    {
                        return(level.Item);
                    }
                }
                foreach (RptMtxLevel level in ColHeader.Levels)
                {
                    if ((level.Row <= p_row && p_row < level.Row + level.RowSpan) &&
                        level.Col <= p_col && p_col < level.Col + level.ColSpan)
                    {
                        return(level.Item);
                    }
                }
                return(null);
            }

            case MtxRangeType.Subtotal:
            {
                foreach (RptMtxLevel level in RowHeader.Levels)
                {
                    RptMtxSubtotal total = GetSubtotal(level.SubTotals.ToList(), p_row, p_col);
                    if (total != null)
                    {
                        return(total.Item);
                    }
                }
                foreach (RptMtxLevel level in ColHeader.Levels)
                {
                    RptMtxSubtotal total = GetSubtotal(level.SubTotals.ToList(), p_row, p_col);
                    if (total != null)
                    {
                        return(total.Item);
                    }
                }
                return(null);
            }

            case MtxRangeType.Subtitle:
            {
                foreach (RptMtxLevel level in RowHeader.Levels)
                {
                    RptMtxSubtitle title = GetSubtitle(level.SubTitles.ToList(), p_row, p_col);
                    if (title != null)
                    {
                        return(title.Item);
                    }
                }
                foreach (RptMtxLevel level in ColHeader.Levels)
                {
                    RptMtxSubtitle title = GetSubtitle(level.SubTitles.ToList(), p_row, p_col);
                    if (title != null)
                    {
                        return(title.Item);
                    }
                }
                return(null);
            }

            case MtxRangeType.Body:
            {
                return(Rows[p_row - Row - Corner.RowSpan].Cells[p_col - Col - Corner.ColSpan]);
            }

            case MtxRangeType.HeaderEmpty:
            {
                return(null);
            }

            default:
                return(null);
            }
        }