网格的各个DataColumn连接在DataSet的一个字段上并显示或修改相关值, 而如果使用计算列,就无需直接连接在数据组字段,也可以构成网格列。
包含在计算列中的数据单元格上显示的值, 每次都是通过指定在valueExpression或valueCallback的设置进行计算的, 而如果将cached属性指定为true,就可以通过保管所得出的值而提高显示性能。 下列网格中,"合计2"列的cached已被设置为true。
var columns = [
...
{
"name": "Amount",
"type": "calced", // 计算列
"valueType": "number", // 数据类型
"valueExpression": "unit_price * quantity",
}, {
"name": "Amount2",
"type": "calced",
"valueType": "number",
"valueCallback": function (column, row) {
return row.getValue('unit_price') * row.getValue('quantity');
},
"cached": true,
}, ...
]
在列设置中,计算列将"type"设置为"calced", 并且通过valueExpression或valueCallback,指定将要显示的值。 而且,需要通过指定valueType,设置所计算的值的数据类型。 如果不进行设置,它就会被设置为NUMBER。
因为显示在计算列中的值是临时的,所以我们不能以这个列为标准进行分组,也几乎不能在页脚等显示合计。 如果非要显示合计,就可以使用ValueColumn.summaryCallback。 上面的网格中,已在"合计2"列设置了summaryCallback。
"footer": {
"summaryCallback": function (column) {
var grid = column.grid();
var fld = grid.dataSource().getFieldIndex('quantity');
var fld2 = grid.dataSource().getFieldIndex('unit_price');
var v = 0;
for (var i = grid.rowCount(); i--;) {
v += grid.getValueAt(i, fld) * grid.getValueAt(i, fld2);
}
return v;
},
"styles": {
"numberFormat": "#,##0.00",
}
}