GridView合并单元格

GridView合并单元格,引合并单元格,实际上是合并数据结构.然后把处理后的数据绑定到GridView控件中.

关键代码:

/// <summary>
    /// 合并GridView单元格
    /// </summary>
    public class MergeGridViewCell
    {
        /// <summary>
        /// GridView合并行,
        /// </summary>
        /// <param name="gv">GridView</param>
        /// <param name="startCol">开始列</param>
        /// <param name="endCol">结束列</param>
        public static void MergeRow(GridView gv, int startCol, int endCol)
        {
            RowArg init = new RowArg()
            {
                StartRowIndex = 0,
                EndRowIndex = gv.Rows.Count - 2
            };
            for (int i = startCol; i < endCol + 1; i++)
            {
                if (i > 0)
                {
                    List<RowArg> list = new List<RowArg>();
                    //从第二列开始就要遍历前一列
                    TraversesPrevCol(gv, i - 1, list);
                    foreach (var item in list)
                    {
                        MergeRow(gv, i, item.StartRowIndex, item.EndRowIndex);
                    }
                }
                //合并开始列的行
                else
                {
                    MergeRow(gv, i, init.StartRowIndex, init.EndRowIndex);
                }
            }
        }

        /// <summary>
        /// 合并GridView单元格
        /// </summary>
        /// <param name="gv">要合并的GridView</param>
        /// <param name="cols">制定的列,要按照顺序传入</param>
        public static void MergeRow(GridView gv, params int[] cols)
        {
            RowArg init = new RowArg()
            {
                StartRowIndex = 0,
                EndRowIndex = gv.Rows.Count - 2
            };
            for (int i = 0; i < cols.Length; i++)
            {
                if (i > 0)
                {
                    List<RowArg> list = new List<RowArg>();
                    //从第二列开始就要遍历前一列
                    TraversesPrevCol(gv, cols[i - 1], list);
                    foreach (var item in list)
                    {
                        MergeRow(gv, cols[i], item.StartRowIndex, item.EndRowIndex);
                    }
                }
                //合并开始列的行
                else
                {
                    MergeRow(gv, i, init.StartRowIndex, init.EndRowIndex);
                }
            }
        }

        /// <summary>
        /// 遍历前一列
        /// </summary>
        /// <param name="gv">GridView</param>
        /// <param name="prevCol">当前列的前一列</param>
        /// <param name="list"></param>
        private static void TraversesPrevCol(GridView gv, int prevCol, List<RowArg> list)
        {
            if (list == null)
            {
                list = new List<RowArg>();
            }
            RowArg ra = null;
            for (int i = 0; i < gv.Rows.Count; i++)
            {
                if (!gv.Rows[i].Cells[prevCol].Visible)
                {
                    continue;
                }
                ra = new RowArg();
                ra.StartRowIndex = gv.Rows[i].RowIndex;
                ra.EndRowIndex = ra.StartRowIndex + gv.Rows[i].Cells[prevCol].RowSpan - 2;
                list.Add(ra);
            }
        }

        /// <summary>
        /// 合并单列的行
        /// </summary>
        /// <param name="gv">GridView</param>
        /// <param name="currentCol">当前列</param>
        /// <param name="startRow">开始合并的行索引</param>
        /// <param name="endRow">结束合并的行索引</param>
        private static void MergeRow(GridView gv, int currentCol, int startRow, int endRow)
        {
            for (int rowIndex = endRow; rowIndex >= startRow; rowIndex--)
            {
                GridViewRow currentRow = gv.Rows[rowIndex];
                GridViewRow prevRow = gv.Rows[rowIndex + 1];
                if (currentRow.Cells[currentCol].Text != "" && currentRow.Cells[currentCol].Text != " ")
                {
                    if (currentRow.Cells[currentCol].Text == prevRow.Cells[currentCol].Text)
                    {
                        currentRow.Cells[currentCol].RowSpan = prevRow.Cells[currentCol].RowSpan < 1 ? 2 : prevRow.Cells[currentCol].RowSpan + 1;
                        prevRow.Cells[currentCol].Visible = false;
                    }
                }
            }
        }

        class RowArg
        {
            public int StartRowIndex { get; set; }
            public int EndRowIndex { get; set; }
        }
    }


运行效果图:

 

演示案例下载地址:http://download.csdn.net/detail/lovegonghui/9266073

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值