android gridview 表头,Gridview 复杂表头 合并的实现

要是实现 下列类型的 表头

开始的时候根据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