[Asp.Net]GridView中根據前后列之間的關聯關系合并單元格
效果如下(合并同一列中相等且連續的N個單元格,但如果前一列沒有合并的話,則后一列也不合并):

代碼如下:
1
合并多列#region 合并多列
2
/**//// <summary>
3
/// GridView合并
4
/// </summary>
5
/// <param name="gdv">GridView</param>
6
/// <param name="startColumnIndex">起始列Index</param>
7
/// <param name="endColumnIndex">結束列Index</param>
8
public static void MergeGridViewRows(GridView gdv, int startColumnIndex, int endColumnIndex)
9
{
10
if (gdv == null || endColumnIndex < startColumnIndex || gdv.Rows.Count < 2)
11
return;
12
if (startColumnIndex < 0 || endColumnIndex > gdv.Columns.Count - 1)
13
throw new ArgumentOutOfRangeException("列Index超出GridView可用列的范圍。");
14
EndColumnIndex = endColumnIndex;
15
MergeCellWithSubColumn(gdv, 0, 0, gdv.Rows.Count - 1);
16
}
17
private static int EndColumnIndex = 0;
18
19
/**//// <summary>
20
/// 合并當前列和后續列
21
/// </summary>
22
/// <param name="currentColumnIndex">當前列</param>
23
/// <param name="startRowIndex">起始行</param>
24
/// <param name="endRowIndex">結束行</param>
25
/// <summary>
26
private static void MergeCellWithSubColumn(GridView gdv, int currentColumnIndex, int startRowIndex, int endRowIndex)
27
{
28
if (currentColumnIndex > EndColumnIndex)//結束遞歸
29
return;
30
string preValue = GetCellValue(gdv,startRowIndex, currentColumnIndex);
31
string curValue = string.Empty;
32
int endIndex = startRowIndex;
33
for (int i = startRowIndex + 1; i <= endRowIndex + 1; i++)
34
{
35
if (i == endRowIndex + 1)
36
curValue = null;//完成最后一次合并
37
else
38
curValue = GetCellValue(gdv, i, currentColumnIndex);
39
if (curValue != preValue)
40
{
41
//合并當前列
42
MergeColumnCell(gdv, currentColumnIndex, endIndex, i - 1);
43
//合并后續列
44
MergeCellWithSubColumn(gdv, currentColumnIndex + 1, endIndex, i - 1);
45
endIndex = i;
46
preValue = curValue;
47
}
48
}
49
}
50
51
/**//// <summary>
52
/// 取得GridView中單個Cell的值
53
/// </summary>
54
/// <param name="gdv">GridView</param>
55
/// <param name="rowIndex">行Index</param>
56
/// <param name="columnIndex">列Index</param>
57
/// <returns></returns>
58
private static string GetCellValue(GridView gdv, int rowIndex, int columnIndex)
59
{
60
return gdv.Rows[rowIndex].Cells[columnIndex].Text;
61
}
62
63
/**//// <summary>
64
/// 合并同列中連續的N個單元格
65
/// 注意:這里只是隱藏后續的單元格,而沒有刪除單元格
66
/// 主要考慮到刪除后會如下兩種情況:
67
/// 1. PostBack后找不回來;
68
/// 2.通過rowIndex和columnIndex來定位單元格的過程會更復雜
69
/// </summary>
70
/// <param name="gdv">GridView</param>
71
/// <param name="columnIndex">列Index</param>
72
/// <param name="startRowIndex">起始行Index</param>
73
/// <param name="endRowIndex">結束行Index</param>
74
private static void MergeColumnCell(GridView gdv, int columnIndex, int startRowIndex, int endRowIndex)
75
{
76
gdv.Rows[startRowIndex].Cells[columnIndex].RowSpan = endRowIndex - startRowIndex + 1;
77
for (int i = startRowIndex + 1; i <= endRowIndex; i++)
78
gdv.Rows[i].Cells[columnIndex].Visible = false;
79
}

合并多列#region 合并多列2

/**//// <summary>3
/// GridView合并4
/// </summary>5
/// <param name="gdv">GridView</param>6
/// <param name="startColumnIndex">起始列Index</param>7
/// <param name="endColumnIndex">結束列Index</param>8
public static void MergeGridViewRows(GridView gdv, int startColumnIndex, int endColumnIndex)9

{10
if (gdv == null || endColumnIndex < startColumnIndex || gdv.Rows.Count < 2)11
return;12
if (startColumnIndex < 0 || endColumnIndex > gdv.Columns.Count - 1)13
throw new ArgumentOutOfRangeException("列Index超出GridView可用列的范圍。");14
EndColumnIndex = endColumnIndex;15
MergeCellWithSubColumn(gdv, 0, 0, gdv.Rows.Count - 1);16
}17
private static int EndColumnIndex = 0;18

19

/**//// <summary>20
/// 合并當前列和后續列21
/// </summary>22
/// <param name="currentColumnIndex">當前列</param>23
/// <param name="startRowIndex">起始行</param>24
/// <param name="endRowIndex">結束行</param>25
/// <summary>26
private static void MergeCellWithSubColumn(GridView gdv, int currentColumnIndex, int startRowIndex, int endRowIndex)27

{28
if (currentColumnIndex > EndColumnIndex)//結束遞歸29
return;30
string preValue = GetCellValue(gdv,startRowIndex, currentColumnIndex);31
string curValue = string.Empty;32
int endIndex = startRowIndex;33
for (int i = startRowIndex + 1; i <= endRowIndex + 1; i++)34

{35
if (i == endRowIndex + 1)36
curValue = null;//完成最后一次合并37
else38
curValue = GetCellValue(gdv, i, currentColumnIndex);39
if (curValue != preValue)40

{41
//合并當前列42
MergeColumnCell(gdv, currentColumnIndex, endIndex, i - 1);43
//合并后續列44
MergeCellWithSubColumn(gdv, currentColumnIndex + 1, endIndex, i - 1);45
endIndex = i;46
preValue = curValue;47
}48
}49
}50

51

/**//// <summary>52
/// 取得GridView中單個Cell的值53
/// </summary>54
/// <param name="gdv">GridView</param>55
/// <param name="rowIndex">行Index</param>56
/// <param name="columnIndex">列Index</param>57
/// <returns></returns>58
private static string GetCellValue(GridView gdv, int rowIndex, int columnIndex)59

{60
return gdv.Rows[rowIndex].Cells[columnIndex].Text;61
}62

63

/**//// <summary>64
/// 合并同列中連續的N個單元格65
/// 注意:這里只是隱藏后續的單元格,而沒有刪除單元格66
/// 主要考慮到刪除后會如下兩種情況:67
/// 1. PostBack后找不回來;68
/// 2.通過rowIndex和columnIndex來定位單元格的過程會更復雜69
/// </summary>70
/// <param name="gdv">GridView</param>71
/// <param name="columnIndex">列Index</param>72
/// <param name="startRowIndex">起始行Index</param>73
/// <param name="endRowIndex">結束行Index</param>74
private static void MergeColumnCell(GridView gdv, int columnIndex, int startRowIndex, int endRowIndex)75

{76
gdv.Rows[startRowIndex].Cells[columnIndex].RowSpan = endRowIndex - startRowIndex + 1;77
for (int i = startRowIndex + 1; i <= endRowIndex; i++)78
gdv.Rows[i].Cells[columnIndex].Visible = false;79
}使用:
GridView的PreRender事件中調用:MergeGridViewRows(gridView,0,5)
也可以將上面的代碼改成JS版本,在客戶端執行。
浙公網安備 33010602011771號