zoukankan      html  css  js  c++  java
  • 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控件)起始列索引,默认是一直算到倒数第二列(最后一列不做合计)。
  • 相关阅读:
    redis配置引发的问题
    String类的split()方法
    修改mysql编码配置文件不生效
    mysql性能优化小知识点
    limit使用
    mysql执行顺序
    记录一个不知名的错误
    子数组最大和及下标
    maven项目中不能加载java目录下的配置文件
    判断树是否为搜索树
  • 原文地址:https://www.cnblogs.com/badwood316/p/1064438.html
Copyright © 2011-2022 走看看