#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