datagrid中添加合计行计算合计
在公司demo项目实习中,我有一个功能是展示所有支出明细后,在下面添加一行合计,计算所有支出明细之和。
首先我想到的是用easyui里datagrid有一个属性showFooter,就是添加尾行,无论在页面添加多少条数据,合计行都会位于所有记录的最下方,而且比较美观。于是我在我的代码中添加了showFooter:true的属性,如下:
<div id="payGrid" wj-type="datagrid"
wj-options="{title:"支出明细",listUrl:"<ww:actionUri action="dirPayDetailData"/>",idField:"uuid",columns:[[
{ field: "ck", checkbox: true },
{ title: "uuid", field: "uuid", width: 100,hidden:true},
{ title: "员工名称", field: "empName", width: 100},
{ title: "支出金额", field: "payMoney", width: 150 },
{ title: "支出时间", field: "payDate", width: 150,formatter:function(value,row,index){
return myFunction(row.payDate);
}},
{ title: "创建时间", field: "createTime", width: 300},
{ title: "修改时间", field: "editTime", width: 300},
{ title: "创建者", field: "creater", width: 300}
]]<span style="color:#ff0000;">,showFooter:true,footer:[{"empName":"合计","payMoney":600.0}]</span>}">这是模仿easyui官网的demo写的。官网demo的数据来源和我的不太相似,如果有兴趣,大家可以了解一下官网的。easyui官网footer-demo
官网的demo中,引入了footer,如下:
<table class="easyui-datagrid" title="Footer Rows in DataGrid" style="width:700px;height:220px"
data-options="
url: "datagrid_data2.json",
method: "get",
fitColumns: true,
singleSelect: true,
rownumbers: true,
showFooter: true
">
<thead>
<tr>
<th data-options="field:"itemid",width:80">Item ID</th>
<th data-options="field:"productid",width:120">Product ID</th>
<th data-options="field:"listprice",width:80,align:"right"">List Price</th>
<th data-options="field:"unitcost",width:80,align:"right"">Unit Cost</th>
<th data-options="field:"attr1",width:250">Attribute</th>
<th data-options="field:"status",width:60,align:"center"">Status</th>
</tr>
</thead>
</table> 引入的json中,有三个属性:total,rows,footer。我理解的是,total是返回前台的记录数,rows是返回的数据,footer是你要添加的尾行。如下:
{"total":28,"rows":[
{"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"},
{"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"},
{"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"},
{"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"},
{"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"},
{"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"},
{"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"},
{"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"},
{"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"},
{"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"}
],"footer":[
{"unitcost":19.80,"listprice":60.40,"productid":"Average:"},
{"unitcost":198.00,"listprice":604.00,"productid":"Total:"}
]}。所以在设置后台返回前台的json格式的时候就要在json中添加footer属性,并设置自己的尾行栏。如下:
<pre name="code" class="java">
public static String listArrayToJson(List<Object[]> list) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("total", list==null?0:list.size());
resultMap.put("rows", list==null?new ArrayList<Object>():list);
return JSONObject.fromObject(resultMap).toString();
}需要在以上代码中加入footer属性。
然而后来发现,这样并不美观。同事说所谓尾行,是无论多少条记录,尾行都处于最下端。与我一开始想的效果并不相同。在经理的指点下,我换了个思路。
我在后台往前台json前,在service中,数据查询后,就插入一行记录,即一个特殊的对象,只有合计和金额两项。
如下:
<pre name="code" class="java">DataReader qc=new DataReader("select a.uuid from WjPayDetail a "+getWhere(model)+orderBy);
if(StringHelper.isEmpty(page.getCountField())){
page.setCountField("uuid");
}
setWhere(model,qc);
page=qc.page(page);
List<WjPayDetail> details=DataReader.idToObj(WjPayDetail.class,page.getResults());
<span style="color:#ff0000;">double paySum=0;
for(WjPayDetail one:details){
paySum=paySum+one.getPayMoney();
}
WjPayDetail detail=new WjPayDetail();
detail.setPayMoney(paySum);
detail.setEmpName("合计金额");
details.add(detail);</span>
page.setResults(details);
res=ModeFactory.getModeFactory().buildNewServiceResult(
IServiceResult.RESULT_OK,Messages.getString("systemMsg.success"),page);红色的部分是我添加的,这样的话,添加的一行,不会存到数据库里,不会影响功能,也不会造成每查询一次,都在上次查询的基础上再添加一行的情况。
前台页面上显示的是,合计行貌似作为一条正常记录展示,貌似可以像其他记录一样修改删除。这种情况,只需要你在后台或者前台做一下判断,再提示用户不可修改或者删除就好了。
总之,我思考了两天的问题,终于在经理的指导下,算是解决了。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
