说明:
当前方式不提倡,最好还是使用 (1)主从表、或(2)分组。
一、数据源
DataTable dta = new DataTable();
dta.Columns.Add("A");
dta.Columns.Add("B");
dta.Columns.Add("C");
dta.Columns.Add("D");
for (int m = 1; m <=20; m++)
dta.Rows.Add($"A{m/5}", $"B", $"C{m/2}",$"D{m}");
grid.DataSource = dta;
二、默认合并
gv.OptionsView.AllowCellMerge = true;
三、根据条件分组合并(根据列A分组合并)
调用示例:
FuncGrid.SetMergeCell(gv, "A", new[] { "B", "C" });
四、自定类
#region 按条件合并
private static string _groupName;
private static string[] _mergeCols;
/// <summary>
/// GridView合并(自定义分组)
/// </summary>
/// <param name="gv"></param>
/// <param name="groupName">分组列(需要合并的列)</param>
/// <param name="mergeCols">需要合并的列</param>
public static void SetMergeCell(GridView gv, string groupName, string[] mergeCols)
{
gv.OptionsView.AllowCellMerge = true;
_groupName = groupName;
_mergeCols = mergeCols;
gv.CellMerge += Gv_CellMerge;
}
private static void Gv_CellMerge(object sender, CellMergeEventArgs e)
{
try
{
GridView myGv = sender as GridView;
if (myGv == null) return;
DataRow dra1 = myGv.GetDataRow(e.RowHandle2 - 1);
DataRow dra2 = myGv.GetDataRow(e.RowHandle2);
if (dra1 == null || dra2 == null) return;
foreach (string str in _mergeCols)
{
if (e.Column.FieldName == str)
{
bool isOk1 = dra1[_groupName].ToString() == dra2[_groupName].ToString();
bool isOk2 = dra1[str].ToString() == dra2[str].ToString();
e.Merge = isOk1 && isOk2;
e.Handled = true;
}
}
}
catch
{
}
}
#endregion