ASP.NET中实现GridView合并

本文介绍了一个用于合并GridView中指定列范围内连续相同值的单元格的方法。该方法通过递归检查每一列,并对相同值的单元格进行合并,适用于ASP.NET Web Forms应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       

效果图              #region 合并多列
        /**/
        /// <summary>
        /// GridView合并
        /// </summary>
        /// <param name="gdv">GridView</param>
        /// <param name="startColumnIndex">起始列Index</param>
        /// <param name="endColumnIndex">结束列Index</param>
        public static void MergeGridViewRows(GridView gdv, int startColumnIndex, int endColumnIndex)
        {
            if (gdv == null || endColumnIndex < startColumnIndex || gdv.Rows.Count < 2)
                return;
            if (startColumnIndex < 0 || endColumnIndex > gdv.Columns.Count - 1)
                throw new ArgumentOutOfRangeException("列Index超出GridView可用列的范围。");
            EndColumnIndex = endColumnIndex;
            //for (int i = 0; i <= endColumnIndex;i++ )
            //{
            //    MergeCellWithSubColumn(gdv, i, 0, gdv.Rows.Count - 1);
            //}
            MergeCellWithSubColumn(gdv, 0, 0, gdv.Rows.Count - 1);
            //MergeCellWithSubColumn(gdv, 9, 0, gdv.Rows.Count - 1);
        }
        private static int EndColumnIndex = 0;

        /**/
        /// <summary>
        /// 合并当前列和后续列
        /// </summary>
        /// <param name="currentColumnIndex">当前列</param>
        /// <param name="startRowIndex">起始行</param>
        /// <param name="endRowIndex">结束行</param>
        /// <summary>
        private static void MergeCellWithSubColumn(GridView gdv, int currentColumnIndex, int startRowIndex, int endRowIndex)
        {
            if (currentColumnIndex > EndColumnIndex)//结束递归
                return;
           
            string preValue = GetCellValue(gdv, startRowIndex, currentColumnIndex);//或采用参照列的值比较来实现合并
            string curValue = string.Empty;
            int endIndex = startRowIndex;
            for (int i = startRowIndex + 1; i <= endRowIndex + 1; i++)
            {
                if (i == endRowIndex + 1)
                    curValue = null;//完成最后一次合并
                else
                    curValue = GetCellValue(gdv, i, currentColumnIndex);//或采用参照列的值比较来实现合并
                if (curValue != preValue)
                {                   
                    //if(currentColumnIndex==9)
                    //    currentColumnIndex = currentColumnIndex;
                    //合并当前列
                    MergeColumnCell(gdv, currentColumnIndex, endIndex, i - 1);
                  
                    preValue = curValue;
                    endIndex = i;
                   
                }
            }
        }

        /// <summary>
        /// 取得GridView中单个Cell的值
        /// </summary>
        /// <param name="gdv">GridView</param>
        /// <param name="rowIndex">行Index</param>
        /// <param name="columnIndex">列Index</param>
        /// <returns></returns>
        private static string GetCellValue(GridView gdv, int rowIndex, int columnIndex)
        {
            return gdv.Rows[rowIndex].Cells[columnIndex].Text;
        }

        /**/
        /// <summary>
        /// 合并同列中连续的N个单元格
        /// 注意:这里只是隐藏后续的单元格,而没有删除单元格
        /// 主要考虑到删除后会如下两种情况:
        /// 1. PostBack后找不回来;
        /// 2.通过rowIndex和columnIndex来定位单元格的过程会更复杂
        /// </summary>
        /// <param name="gdv">GridView</param>
        /// <param name="columnIndex">列Index</param>
        /// <param name="startRowIndex">起始行Index</param>
        /// <param name="endRowIndex">结束行Index</param>
        private static void MergeColumnCell(GridView gdv, int columnIndex, int startRowIndex, int endRowIndex)
        {
            gdv.Rows[startRowIndex].Cells[columnIndex].RowSpan = endRowIndex - startRowIndex + 1;
            for (int i = startRowIndex + 1; i <= endRowIndex; i++)
                gdv.Rows[i].Cells[columnIndex].Visible = false;
        }

        #endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值