要是实现 下列类型的 表头
开始的时候根据http://www.cnblogs.com/myjece/archive/2009/03/06/1404681.html 写法如下
int layerCount = 0;//层数
TableCell[] oldCells;
if (e.Row.RowType == DataControlRowType.Header)
{
oldCells = new TableCell[e.Row.Cells.Count];
e.Row.Cells.CopyTo(oldCells, 0);
//获取最大层数
for (int i = 0; i < e.Row.Cells.Count; i++)
{
int t = oldCells[i].Text.Split('|').Length;
if (t > layerCount)
{
layerCount = t;
}
}
e.Row.Cells.Clear();
TableHeaderCell tc = null;
int flag = 0;
//处理行
for (int i = 1; i <= layerCount; i++)
{
for (int j = 1; j <= oldCells.Length; j++)
{
string[] arr = oldCells[j - 1].Text.Split('|');
if (arr.Length == i)
{
tc = new TableHeaderCell();
if (layerCount - i > 0)
{
tc.RowSpan = layerCount - i + 1;//定义表头的所占的行数
}
tc.Text = arr[i - 1];
tc.CssClass = _gv.HeaderStyle.CssClass;
e.Row.Cells.Add(tc);
}
else if (arr.Length > i)
{
flag++;
if (j >= oldCells.Length || oldCells[j].Text.Split('|').Length < i || arr[i - 1] !=
oldCells[j].Text.Split('|')[i - 1])
{
tc = new TableHeaderCell();
tc.ColumnSpan = flag;
tc.Text = arr[i - 1];
tc.CssClass = _gv.HeaderStyle.CssClass;
e.Row.Cells.Add(tc);
flag = 0;
}
}
}
if (i < layerCount)
{
if (tc != null)
{
tc.Text += "
";}
}
}
}
uclBB1.GridViewHeadText = "项目分区,项目分区,井数(口),好油层|层段数,好油层|调整前|日配注(m3/d),好油层|调整 前|注水强度(m3/d.m),好油层|调整后|日配注(m3< /sup>/d),好油层|调整后|注水强度(m3/d.m),差油层|层段数,差油层|调整前| 日配注(m3/d),差油层|调整前|注水强度(m3 /d.m),差油层|调整后|日配注(m3/d),差油层|调整后|注水强度 (m3/d.m),合计|层段数,合计|调整前|日配注(m3< /sup>/d),合计|调整前|注水强度(m3/d.m),合计|调整后|日配注 (m3/d),合计|调整后|注水强度(m3 /d.m)";
但是单独列跨两行 没有实现。如项目分类 列。
所以改进了一下
#region 合并表头
protected void gvUser_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
int layerCount = 0;//层数
ArrayList oldCells = new ArrayList();
try
{
int iCellCount = e.Row.Cells.Count;//列数
foreach (TableCell oldtc in e.Row.Cells )
{
oldCells.Add(oldtc);
}
for (int k = 0; k < iCellCount; k++)//将gvHeadText中的列名付给oldcells
{
((TableCell)oldCells[k]).Text = ((string)ViewState["GridviewHeadText"]).Split(',')[k].ToString();
}
//获取最大层数
for (int i = 0; i < iCellCount; i++)
{
int t = ((TableCell)oldCells[i]).Text.Split('|').Length;
if (t > layerCount)
{
layerCount = t;
}
}
e.Row.Cells.Clear();
TableHeaderCell tc = null;
int flag = 0;
int flag1 = 1;
//处理行
for (int i = 1; i <= layerCount; i++)
{
for (int j = 1; j <= oldCells.Count; j++)
{
string[] arr = ((TableCell)oldCells[j - 1]).Text.Split('|');
if (arr.Length == i)
{
tc = new TableHeaderCell();
if (layerCount - i > 0)
{
tc.RowSpan = layerCount - i + 1;//定义表头的所占的行数
}
tc.Text = arr[i - 1];
tc.CssClass = gvUser.HeaderStyle.CssClass;
if(j!=oldCells.Count)
{
for (int k = j+1 ; k < oldCells.Count; k++)
{
if (((TableCell)oldCells[j - 1]).Text == ((TableCell)oldCells[k - 1]).Text)
{
flag1++;
oldCells.RemoveAt(k-1);
tc.ColumnSpan = flag1;
}
}
flag1 = 1;
}
e.Row.Cells.Add(tc);
}
else if (arr.Length > i)
{
flag++;
if (j >= oldCells.Count || ((TableCell)oldCells[j]).Text.Split('|').Length < i || arr[i - 1] != ((TableCell)oldCells[j]).Text.Split('|')[i - 1])
{
tc = new TableHeaderCell();
tc.ColumnSpan = flag;
tc.Text = arr[i - 1];
tc.CssClass = gvUser.HeaderStyle.CssClass;
e.Row.Cells.Add(tc);
flag = 0;
}
}
}
if (i < layerCount)
{
if (tc != null)
{
tc.Text += "
";}
}
}
}
catch (System.Exception ex)
{
Response.Write(e.ToString() + ":CY7BB_gvuer_RowCreat函数出错");
}
}
}
#endregion
就是将gridbiewheader 数据源中重复的删除。
最终效果如下;
bug 重复列必须相邻 否则可能会出错。因为在判断重复那块没有严密处理。
综合调整方案注水结构变化表
项目分区
项目分区
井数(口)
好油层
差油层
合计
层段数
调整前
调整后
层段数
调整前
调整后
层段数
调整前
调整后
日配注(m3/d)
注水强度(m3/d.m)
日配注(m3/d)
注水强度(m3/d.m)
日配注(m3/d)
注水强度(m3/d.m)
日配注(m3/d)
注水强度(m3/d.m)
日配注(m3/d)
注水强度(m3/d.m)
日配注(m3/d)
注水强度(m3/d.m)
葡北一断块
基础井
43
67
910
3.45
920
3.55
92
1130
4.1
1130
4.1
46
1775
3.89
1775
3.93
一次井
15
28
480
4.11
460
3.94
24
410
6.37
410
6.37
16
890
4.91
870
4.8
二次井
3
6
40
2.16
55
2.97
11
205
10.3
215
10.8
4
245
6.38
270
7.03
老井
61
101
1430
3.58
1435
3.64
127
1745
4.85
1755
4.88
66
2910
4.3
2915
4.34
合计
66
110
1550
3.68
1555
3.74
138
1880
4.88
1880
4.88
73
3140
4.36
3135
4.38
葡北二断块
基础井
76
114
1275
2.68
1275
2.68
114
1135
3.63
1195
3.82
75
2120
3.23
2180
3.33
一次井
71
128
1775
3.11
1850
3.2
158
2095
5.49
2045
5.28
68
3285
4.23
3300
4.18
二次井
8
15
180
4.09
180
4.09
14
175
6.6
175
6.6
8
355
5.04
355
5.04
老井
155
257
3230
2.96
3305
3.01
286
3405
4.72
3415
4.7
151
5760
3.83
5835
3.85
合计
163
272
3365
2.95
3470
3.02
317
3705
4.7
3750
4.73
166
6195
3.82
6335
3.88
葡北三断块
基础井
55
107
1705
3.63
1710
3.65
133
2010
5
2010
4.98
61
3420
4.55
3425
4.55
一次井
85
177
2570
3.9
2615
3.97
185
3200
7.73
3265
7.89
89
5720
5.55
5800
5.63
二次井
20
41
460
2.66
525
3
49
855
6.74
875
7.07
24
1315
4.38
1400
4.69
老井
160
325
4735
3.64
4850
3.72
367
6065
6.44
6150
6.53
174
10455
5.02
10625
5.11
合计
164
332
4815
3.62
4930
3.71
381
6295
6.33
6365
6.41
180
10765
4.98
10920
5.05