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控件)起始列索引,默认是一直算到倒数第二列(最后一列不做合计)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值