关键词:
报表列表、选择行、刷新、缓存
一、需求背景
报表中,执行工具栏某个业务操作之后,报表查询的数据源会发生改变,需要执行刷新报表列表数据(刷新报表列表数据时会清空选择行状态)。现在客户需要在刷新报表列表数据的时候,不刷新已选行状态。
二、原型图
三、实现方案
1、分析思路
首先,从问题出发。调用报表列表刷新操作的时候,会把报表列表的表格的所有状态数据都会清空,这个可以进去查看reportlistap.refresh 的源码分析到。
ReportList reportlistap = this.getView().getControl("reportlistap");
reportlistap.refresh();
2、 解决方案
既然刷新会清空报表列表的选择行状态,那么我们就需要在刷新逻辑之后的某个事件中去把选择状态加回来就行了。可以在行数据处理事件processRowData或者格式化发送给前端的数据事件packageData时,为报表列表添加前面已经选择的选择行。
四、实现过程
1、点击业务操作按钮之前,把已选行放到页面缓存中
public class KeepSelectRptFormPlugin extends AbstractReportFormPlugin {
@Override
public void registerListener(EventObject e) {
Toolbar toolbarap = this.getView().getControl("toolbarap");
toolbarap.addItemClickListener(this);
super.registerListener(e);
}
@Override
public void beforeItemClick(BeforeItemClickEvent evt) {
String itemKey = evt.getItemKey();
if (itemKey.equals("kded_bussinessop")) {
ReportList reportlistap = this.getView().getControl("reportlistap");
GridState entryState = reportlistap.getEntryState();
int[] selectedRows = entryState.getSelectedRows();
StringBuilder rowStr = new StringBuilder();
for (int rowIndex : selectedRows) {
rowStr.append(rowIndex);
rowStr.append(",");
}
//把选择行数据放入缓存中
this.getPageCache().put("selectedRows", rowStr.toString());
}
super.beforeItemClick(evt);
}
2、执行业务操作之后,刷新报表列表
@Override
public void itemClick(ItemClickEvent evt) {
String itemKey = evt.getItemKey();
if (itemKey.equals("kded_bussinessop")) {
// 执行其他业务操作...
ReportList reportlistap = this.getView().getControl("reportlistap");
// 刷新报表列表
reportlistap.refresh();
}
super.itemClick(evt);
}
3、重新选择行
@Override
public void processRowData(String gridPK, DynamicObjectCollection rowData, ReportQueryParam queryParam) {
super.processRowData(gridPK, rowData, queryParam);
if (rowData != null && !rowData.isEmpty()) {
//从页面缓存中获取刷新之前的选择行
String selectedRowstr = this.getPageCache().get("selectedRows");
if (selectedRowstr != null) {
String[] split = selectedRowstr.split(",");
int[] seletRows = new int[split.length];
for (int i = 0; i < split.length; i++) {
seletRows[i] = Integer.valueOf(split[i]);
}
ReportList reportlistap = this.getView().getControl("reportlistap");
reportlistap.selectRows(seletRows, seletRows[0]);
//这一步也非常重要:清除缓存,保证只在刷新列表的时候把已选择行选上
this.getPageCache().remove("selectedRows");
}
}
}
}
五、效果图
点击执行业务操作,已选的第四、第五行仍处于已选状态。
六、开发环境版本
COSMICV4.0.010.0
七、参考资料
demo.zip(24.69KB)
推荐阅读