扩展GridView控件(11) - 合并指定列的相邻且内容相同的单元格

GridView既强大又好用。为了让它更强大、更好用,咱们来写一个继承自GridView的控件。
[索引页]
[×××]


扩展GridView控件(11) - 合并指定列的相邻且内容相同的单元格


做者:webabcd


介绍
扩展GridView控件:
合并指定列的相邻且内容相同的单元格

使用方法(设置属性): 
MergeCells -  须要合并单元格的列的索引(用逗号“,”分隔)


关键代码
实现“合并指定列的相邻且内容相同的单元格”功能的代码
using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI.WebControls;
using System.Web.UI;

namespace YYControls.Helper
{
         /// <summary>
         /// SmartGridView的Helper
         /// </summary>
         public class SmartGridView
        {
                 /// <summary>
                 /// 合并指定列的相邻且内容相同的单元格
                 /// </summary>
                 /// <param name="gv">GridView</param>
                 /// <param name="columnIndices">须要合并单元格的列的索引(用逗号“,”分隔)</param>
                 public static void MergeCells(GridView gv, int[] columnIndices)
                {
                         // 指定的列中须要设置RowSpan的单元格的行索引
                         int[] aryInt = new int[columnIndices.Length];
                         // 是否从新指定aryInt的相关元素的值
                         // aryInt中的元素与aryBln中的元素一一对应
                         bool[] aryBln = new bool[columnIndices.Length];
                         // aryInt初值均为0
                         for ( int i = 0; i < aryInt.Length; i++)
                        {
                                aryInt[i] = 0;
                        }
                         // aryBln初值均为true
                         for ( int i = 0; i < aryBln.Length; i++)
                        {
                                aryBln[i] = true;
                        }

                         for ( int i = 1; i < gv.Rows.Count; i++)
                        {
                                 // 本行和上一行均为DataControlRowType.DataRow
                                 if (gv.Rows[i].RowType == DataControlRowType.DataRow && gv.Rows[i - 1].RowType == DataControlRowType.DataRow)
                                {
                                         // 遍历指定的列索引
                                         for ( int j = 0; j < columnIndices.Length; j++)
                                        {
                                                 // 列索引超出范围则不处理
                                                 if (columnIndices[j] < 0 || columnIndices[j] > gv.Columns.Count - 1) continue;

                                                 // 相邻单元格的内容相同
                                                 if (gv.Rows[i].Cells[columnIndices[j]].Text == gv.Rows[i - 1].Cells[columnIndices[j]].Text)
                                                {
                                                         if (aryBln[j])
                                                                aryInt[j] = i - 1;

                                                         if (gv.Rows[aryInt[j]].Cells[columnIndices[j]].RowSpan == 0)
                                                                gv.Rows[aryInt[j]].Cells[columnIndices[j]].RowSpan = 1;

                                                        gv.Rows[aryInt[j]].Cells[columnIndices[j]].RowSpan++;
                                                        gv.Rows[i].Cells[columnIndices[j]].Visible = false;

                                                        aryBln[j] = false;
                                                }
                                                 else
                                                {
                                                        aryBln[j] = true;
                                                }
                                        }
                                }
                        }
                }
        }
}
 
上面的MergeCells(GridView gv, int[] columnIndices)方法用于实现“合并指定列的相邻且内容相同的单元格”,第一个参数是GridView,第二个参数是须要合并单元格的列的索引(用逗号“,”分隔)。

为GridView新增一个属性
using System;
using System.Collections.Generic;
using System.Text;

using System.ComponentModel;

namespace YYControls
{
         /// <summary>
         /// SmartGridView类的属性部分
         /// </summary>
         public partial class SmartGridView
        {
                 private string _mergeCells;
                 /// <summary>
                 /// 须要合并单元格的列的索引(用逗号“,”分隔)
                 /// </summary>
                [
                Browsable( true),
                Description( "须要合并单元格的列的索引(用逗号“,”分隔)"),    
                Category( "扩展")
                ]
                 public virtual string MergeCells
                {
                        get { return _mergeCells; }
                        set { _mergeCells = value; }
                }
        }
}
 
继承YYControls.SmartGridViewFunction.ExtendFunction抽象类,重写其Execute()方法
using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI.WebControls;

namespace YYControls.SmartGridViewFunction
{
         /// <summary>
         /// 扩展功能:合并指定列的相邻且内容相同的单元格
         /// </summary>
         public class MergeCellsFunction : ExtendFunction
        {
                 /// <summary>
                 /// 构造函数
                 /// </summary>
                 public MergeCellsFunction()
                        : base()
                {

                }

                 /// <summary>
                 /// 构造函数
                 /// </summary>
                 /// <param name="sgv">SmartGridView对象</param>
                 public MergeCellsFunction(SmartGridView sgv)
                        : base(sgv)
                {
        
                }

                 /// <summary>
                 /// 扩展功能的实现
                 /// </summary>
                 protected override void Execute()
                {
                         this._sgv.DataBound += new EventHandler(_sgv_DataBound);
                }

                 /// <summary>
                 /// SmartGridView的DataBound事件
                 /// </summary>
                 /// <param name="sender"></param>
                 /// <param name="e"></param>
                 void _sgv_DataBound( object sender, EventArgs e)
                {
                         string[] ary = this._sgv.MergeCells.Split(',');
                         int[] columnIndices = new int[ary.Length];

                         // 将字符串数组转为整型数组
                         for ( int i = 0; i < columnIndices.Length; i++)
                        {
                                 int j;
                                 if (!Int32.TryParse(ary[i], out j))
                                {
                                         // 转整型失败则赋值为-1,“合并指定列的相邻且内容相同的单元格”则不会处理
                                        j = -1;
                                }

                                columnIndices[i] = j;
                        }

                        YYControls.Helper.SmartGridView.MergeCells( this._sgv, columnIndices);
                }
        }
}
 

OK
[×××]