本文介绍了在同一列表中展示不同单据,并动态添加“创建人”和“单据类型”等自定义字段的过程。由于原始方案只展示单据编号和状态,用户希望增加更多信息。通过注册监听器和动态创建列,实现了自定义字段的添加。但列表控件只能显示单据本身字段,故需在单据中添加新字段。修改取数逻辑,为自定义字段赋值。此外,修正了数据总数显示问题,通过重写getRealCount方法解决了列表只显示部分数据的问题。
标签:
列表、不同单据
需求背景:
将不同的单据放在同一列表展示的需求可以通过https://vip.kingdee.com/article/214023634032177920的方案。但是该方案只实现列表展示单据编号和单据状态两个字段,还希望能放创建人和单据类型等字段。创建人是单据有的字段,而单据类型是单据没有的字段。
分析过程:
刚开始是想在列表控件直接增加表格字段,绑定单据的创建人名称字段,如图,然后取数时增加creator.name。
但是由于取到的是平铺对象,值是字符串,而列表字段字段映射是基础资料属性,导致类型转换报错
所以只能自己动态创建列(文本类型),然后取数时取到单据的creator.name给动态列对应的字段赋值。
实现步骤:
关键步骤1:给列表控件注册CreateListColumnsListener监听,并在CreateListColumns事件增加两个自定义列。
@Override public void initialize() { // TODO Auto-generated method stub super.initialize(); BillList billlist=this.getView().getControl("billlistap"); //给列表控件注册增加自定义列监听 billlist.addCreateListColumnsListener(this); //给列表控件注册增加自定义取数监听 billlist.addCreateListDataProviderListener(this); } @Override public void createListColumns(BeforeCreateListColumnsArgs paramBeforeCreateListColumnsArgs) { // TODO Auto-generated method stub // 设计器预置的列集合 List<IListColumn> columns = paramBeforeCreateListColumnsArgs.getListColumns(); ListColumn colText1= this.createListColumn("kded_textfield", "创建人", 3); colText1.setParentViewKey("kded_listgridviewap");//列表控件里表格视图的标识 columns.add(colText1); ListColumn colText2 = this.createListColumn("kded_textfield1", "单据类型", 4); colText2.setParentViewKey("kded_listgridviewap");//列表控件里表格视图的标识 columns.add(colText2); } /** * 创建列对象返回 * * @param key 列标识,需要显示的字段,如"textfield"、 "basedatafield.name" * @param caption 列标题 * @param colIndex 列顺序 * @return */ private ListColumn createListColumn(String key,String caption,int colIndex) { ListColumn col = new ListColumn(); col.setCaption(new LocaleString(caption)); col.setKey(key); col.setListFieldKey(key); col.setFieldName(key); col.setSeq(colIndex); col.setWidth(new LocaleString("8%")); return col; }
关键步骤2.通过上一个步骤增加的自定义字段,预览列表看不到字段,但是在列表设置控制可以看到,原因是列表控件的限制,只能显示单据本来的字段,所以需要在对应的单据增加kded_textfield、kded_textfield1这两个文本字段。
关键步骤3.修改取数逻辑,将取到的crearor.name赋值给kded_textfield,kded_textfield1赋值单据类型。
@Override public void initialize() { // TODO Auto-generated method stub super.initialize(); BillList billlist=this.getView().getControl("billlistap"); billlist.addCreateListDataProviderListener(this); } @Override public void createListDataProvider(BeforeCreateListDataProviderArgs paramBeforeCreateListDataProviderArgs) { // TODO Auto-generated method stub paramBeforeCreateListDataProviderArgs.setListDataProvider(new ListDataProvider() { @Override public DynamicObjectCollection getData(int start, int limit) { return getCollection();//自己重新取数 } }); } private DynamicObjectCollection getCollection() { QFilter filter= new QFilter("billstatus", QCP.not_equals,"A");//根据业务需求自定定义数据过滤条件 DynamicObjectCollection dCollection1 = QueryServiceHelper.query("kded_officesuppliesbill", "billno,billstatus,creator.name,kded_textfield,kded_textfield1,id", new QFilter[] {filter}); DynamicObjectCollection dCollection2 = QueryServiceHelper.query("kded_offsupregisterbill", "billno,billstatus,creator.name,kded_textfield,kded_textfield1,id", new QFilter[] {filter}); for(DynamicObject object:dCollection1) { object.set(3, object.get("creator.name")); object.set(4, "办公用品领用申请单"); } for(DynamicObject object:dCollection2) { object.set(3, object.get("creator.name")); object.set(4, "办公用品登记单"); } dCollection1.addAll(dCollection2); return dCollection1; }
实现效果:
遗留问题:
如上图,列表只展示了4条数据,但是总计是8条,原因是是自己自定义取数需要重写kd.bos.mvc.list.ListDataProvider的getRealCount()方法。
@Override public void createListDataProvider(BeforeCreateListDataProviderArgs paramBeforeCreateListDataProviderArgs) { // TODO Auto-generated method stub paramBeforeCreateListDataProviderArgs.setListDataProvider(new ListDataProvider() { @Override public int getRealCount() { // TODO Auto-generated method stub DynamicObjectCollection collections=getCollection();//重复取数可能有性能问题,可考虑使用缓存存储集合大小 return collections.size(); } @Override public DynamicObjectCollection getData(int start, int limit) { //自己重新取数 return getCollection(); } });}
实现效果如下
推荐阅读