GridView中的多重表头及合计行

    GridView是一个比较好的展示数据的控件,数据可以非常简单的绑定到表格,几乎不用编太多程,但是如果要展示的数据表外形上需要多行表头,或者合计行,就需要另外处理一下了:
    一、多行表头需要重载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事件中应该也能做(偷懒没试),下面是在绑定后单独做的,方法很简单,没有考虑效率和设计结构的问题:
 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控件)起始列索引,默认是一直算到倒数第二列(最后一列不做合计)。
原文地址:https://www.cnblogs.com/badwood316/p/1064438.html