单据列表控件是可以嵌在单据,动态表单,基础资料的一种表格控件,通过与这些页面类型相融合,可以创造出一些更加高度定制化的功能,就比如bos_list是我们最常见的单据列表页面,它里面展示列表数据的控件也是单据列表控件.
最近有个需求,在动态表单里的 单据列表控件点选了列表行之后,在改变过滤条件后,这个点选的列表行依然要存在查询结果里,作为对比行与其他的结果做对比,那这个需求是可以通过插件来实现的.(有同学可能就会问了,为什么不用系统自带的单据列表来做呢,因为使用系统的单据列表只能在过滤里面增加缩小查询范围的filter,而不能像这个需求一样扩大查询范围)
实现方案
我们先来构建一下我们的测试页面
1 新建一个单据页面,单据列表控件是需要有单据才能创建的,单据使用默认的模板就可以,
2 新建一个动态表单,表单里面添加两个控件,一个是我们用来切换过滤条件的下拉列表,下拉列表里面配置暂存提交审核,对应着ABC的值,另外一个就是我们的主角,单据列表控件了
在这里我们没有配置他的单据实体,这里可以通过插件代码里的初始化生效的,
3 添加插件,在动态表单上添加插件,
import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.entity.datamodel.ListSelectedRowCollection;
import kd.bos.entity.datamodel.events.ChangeData;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.form.events.SetFilterEvent;
import kd.bos.form.events.SetFilterListener;
import kd.bos.list.BillList;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
public class CommonBillListPlugin4 extends AbstractBillPlugIn implements SetFilterListener{
private QFilter qFilter;
@Override
public void initialize() {
super.initialize();
BillList billList = this.getView().getControl("kded_billlistap");
billList.addSetFilterListener(this);//添加filter监听
billList.setBillFormId("kded_aaaaa");//初始化单据实体--加载的单据页面标识,这个也可以在页面配置的
}
public void propertyChanged(PropertyChangedArgs e) {
super.propertyChanged(e);
ChangeData[] valueSet = e.getChangeSet();
Object newValue = valueSet[0].getNewValue();
Object oldValue = valueSet[0].getOldValue();
if (null != newValue && newValue.equals(oldValue)) {
return;
}
String propName = e.getProperty().getName();
if (propName.equals("kded_combofield")) {
qFilter=null;
String status= (String) newValue;
queryBillList(status);
}
}
void queryBillList(String status){
BillList billlistap = getControl("kded_billlistap");
ListSelectedRowCollection selectedRows = billlistap.getSelectedRows();
int[] rks=selectedRows.getRowKeys();
Object[] list = selectedRows.getPrimaryKeyValues();
qFilter = new QFilter("billstatus",QCP.equals,status);
qFilter=qFilter.or("id",QCP.in,list);
billlistap.selectRows(rks);
billlistap.refresh();
}
@Override
public void setFilter(SetFilterEvent paramSetFilterEvent) {
paramSetFilterEvent.addCustomQFilter(qFilter);
}
}
实现效果
首先我们在单据上添加几条数据,最好各种状态的数据都有几条
我们在下拉列表选取提交,这个时候查询的结果的就会弹出提交的结果,我们这个时候点选一条数据
然后我们再在下拉列表里面选择其他状态,就可以看到这次查询出来的结果不仅是可以查到当前状态的数据,也包括我们之前点选的数据
推荐阅读