5.7. 表格合计,多种内置公式对数据进行合计

表格合计指的是对表格中某一列所有的数据执行某个数学操作(如求和,求平均等),并将操作结果以一行数据的形式展现出来,而且这一行的样式可由用户自由指定(比如为了醒目,可以加粗,加色)。

在定义表格时,用summaryRowPosition属性指定结果行所处的位置,其取值为"inner"或"out",设置为inner时,合计行位置紧跟数据行,随垂直滚动条移动;设置为out时,合行行位置在DataGrid的最下面,不随垂直滚动条移动.

在定义表格的每一列时,用summaryType属性指定该列合计的类型,可以设置为sum(求和),count(行数目),max(最大值),min(最小值),average(平均值)共5种运算类型。

在前面说过,合计行的样式可有用户自由指定,这是由于,在定义表格的每一列时,可用summaryRenderer属性指定这一个合计单元格的渲染样式,用户要给它传一个客户端js函数。该js函数包含3个参数.

    * v:单元格的数据值
    * param:一个持有以下两个属性的对象,用户可以在方法中对其作出改变:
          o style:单元格所在的元素的样式,它将被渲染给td。例如:param.style='background-color:green;';
          o css:单元格所在的元素的css样式类名
          o attr:在单元格内部的容器元素的HTML属性值。例如,设置提示信息:params.attr = 'ext:qtip="Total no. of companies"';
    * data:合计行的整行数据

下面举一个例子。下面的代码定义了一个合计表格,合计行在表格外部,不随滚动条一起移动。表格有3列,第一列合计类型为“求和”,第二列为“求最大值”,第三列为“求均值”。合计行的渲染样式由totalCount函数指定。

<w:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style>
        .red{
            color:red;
        }
    </style>
    <script>
        //<![CDATA[
        function totalCount(v, params, data) {
               params.attr = 'ext:qtip="total count"'; // summary column tooltip example
               params.css  = 'red';
               return v?  ' 合计:' + v  : '';
        }
        //]]>
    </script>
</w:head>
<w:page title="系统模块管理">
    <w:form>
    <w:dataGrid id="grid" paged="true" showRowNumber="true" rows="16"  toolBarPosition="top" height="220" summaryRowPosition="out">
        <w:outputColumn id="a" header="id" summaryType="sum" summaryRenderer="totalCount"/>
        <w:outputColumn id="b" header="num" summaryType="max"/>
        <w:outputColumn id="c" header="test" summaryType="average"/>
    </w:dataGrid>
    </w:form>
</w:page>

下面是LiteBean的部分代码。其中 Num类是一个辅助类(标准的JavaBean)

......
    @Bind(id = "grid")
    private UIDataGrid grid;
    private List<Num> nums = new ArrayList<Num>();
    public GridSummaryBean() {
        nums.add(new Num(11, 2.1f, 3.2));
        nums.add(new Num(3, 1.8f, 4.6));
        ......
        nums.add(new Num(7, 8.7f, 4.8));
        nums.add(new Num(4, 3.2f, 8.68));
        nums.add(new Num(8, 9.8f, 9.10));
    }
    @DataModel(id = "grid")
    public List<Num> getNums() {
            return nums;
    }
......

下面是运行结果的截图