GridView中的多重表头及合计行
GridView是一个比较好的展示数据的控件,数据可以非常简单的绑定到表格,几乎不用编太多程,但是如果要展示的数据表外形上需要多行表头,或者合计行,就需要另外处理一下了:
一、多行表头需要重载GridView的OnRowCreated事件:
一、多行表头需要重载GridView的OnRowCreated事件:
1 protected void gvMain_RowCreated(object sender, GridViewRowEventArgs e)
2 {
3 if (e.Row.RowType == DataControlRowType.Header)
4 {//判断创建的行是不是标题行
5 TableCellCollection tcl = e.Row.Cells;
6 //清除自动生成的表头
7 tcl.Clear();
8 //添加新的表头
9 tcl.Add(new TableHeaderCell());
10 tcl[0].RowSpan = 2;
11 tcl[0].Text = "标题s";
12 Label l1 = new Label();
13 l1.Text = "uu";
14 Button bt = new Button();
15 bt.Text = "1";
16 //因为自定义表头,所以原来系统中实现的排序功能就失效了
17 //下面语句可以自己在表头中添加控件,自己实现排序功能
18 tcl[0].Controls.Add(l1);
19 tcl[0].Controls.Add(bt);
20 tcl.Add(new TableHeaderCell());
21 tcl[1].ColumnSpan = 2;
22 tcl[1].Text = "标题2";
23 tcl.Add(new TableHeaderCell());
24 tcl[2].RowSpan = 2;
25 tcl[2].Text = "标题3";
26 tcl.Add(new TableHeaderCell());
27 tcl[3].ColumnSpan = 3;
28 tcl[3].Text = "标题4";
29 tcl.Add(new TableHeaderCell());
30 tcl[4].RowSpan = 2;
31 //这段是重点 其实在生成的html中tcl[4]转化为<th>标题5</th>,所以依照该原则注入html标签来实现,原理有些类似于SQL注入攻击
32 tcl[4].Text = "标题5</th></tr><tr><th>标题2-1</th><th>标题2-2</th><th>标题4-1</th><th>标题4-2</th><th>标题4-3";
33 }
34 }
35
二、合计用FooterRow实现,可以在数据绑定后来实现,或者在RowCreated事件中应该也能做(偷懒没试),下面是在绑定后单独做的,方法很简单,没有考虑效率和设计结构的问题:2 {
3 if (e.Row.RowType == DataControlRowType.Header)
4 {//判断创建的行是不是标题行
5 TableCellCollection tcl = e.Row.Cells;
6 //清除自动生成的表头
7 tcl.Clear();
8 //添加新的表头
9 tcl.Add(new TableHeaderCell());
10 tcl[0].RowSpan = 2;
11 tcl[0].Text = "标题s";
12 Label l1 = new Label();
13 l1.Text = "uu";
14 Button bt = new Button();
15 bt.Text = "1";
16 //因为自定义表头,所以原来系统中实现的排序功能就失效了
17 //下面语句可以自己在表头中添加控件,自己实现排序功能
18 tcl[0].Controls.Add(l1);
19 tcl[0].Controls.Add(bt);
20 tcl.Add(new TableHeaderCell());
21 tcl[1].ColumnSpan = 2;
22 tcl[1].Text = "标题2";
23 tcl.Add(new TableHeaderCell());
24 tcl[2].RowSpan = 2;
25 tcl[2].Text = "标题3";
26 tcl.Add(new TableHeaderCell());
27 tcl[3].ColumnSpan = 3;
28 tcl[3].Text = "标题4";
29 tcl.Add(new TableHeaderCell());
30 tcl[4].RowSpan = 2;
31 //这段是重点 其实在生成的html中tcl[4]转化为<th>标题5</th>,所以依照该原则注入html标签来实现,原理有些类似于SQL注入攻击
32 tcl[4].Text = "标题5</th></tr><tr><th>标题2-1</th><th>标题2-2</th><th>标题4-1</th><th>标题4-2</th><th>标题4-3";
33 }
34 }
35
1 private void AddTotle(GridView gv,DataSet ds,int pos, int start)
2 {
3 long count=0;
4 if (gv.FooterRow == null)
5 return;
6 gv.FooterRow.Cells[pos].Text = "合计";
7 for (int i = start; i < ds.Tables[0].Columns.Count-1; i++)
8 {
9 count = 0;
10 for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
11 {
12 count += int.Parse(ds.Tables[0].Rows[j][i].ToString());
13 }
14 gv.FooterRow.Cells[i].Text = count.ToString();
15 }
16 }
其中ds是数据表,在算合计的时候需要遍历整个表;pos是需要显示“合计”二字的GridView控件的列索引;start是需要做合计计算的数据集(DataSet控件)起始列索引,默认是一直算到倒数第二列(最后一列不做合计)。
2 {
3 long count=0;
4 if (gv.FooterRow == null)
5 return;
6 gv.FooterRow.Cells[pos].Text = "合计";
7 for (int i = start; i < ds.Tables[0].Columns.Count-1; i++)
8 {
9 count = 0;
10 for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
11 {
12 count += int.Parse(ds.Tables[0].Rows[j][i].ToString());
13 }
14 gv.FooterRow.Cells[i].Text = count.ToString();
15 }
16 }