金蝶云苍穹-动态表单中使用单据体控件如何动态控制操作列的显示
实现
先说一下,官方文档中提供的hideOperateItems方法,并不实用,只要翻页之后,就会没有效果。hideOperateItems 方法只会针对当前的表格做隐藏的处理,并不是真正的修改数据,并且如果你设置的行号大于了当前单据体的最大展示行数,还会把整个表格都隐藏掉,所以如果你的单据体不需要翻页的话,是可以用这个方法的。
动态表单中的单据体的实体对象时EntryGrid。该类可以添加PackageDataListener ,对PackageData事件进行监听,从而达到和单据列表中的packageData方法一样的效果。
如何使用
-
插件实现Consumer<PackageDataEvent>接口,并重写 accpet方法,这个方法和单据列表的packageData方法效果一样
-
在afterCreateNewData() 事件中为单据体添加监听器,这一步是为了,在赋值之后,就可以直接触发accpet方法
-
在registerListener() 事件中为单据体添加监听器,这一步是为了,用户在单据体界面中做交互时,如果触发了刷新单据体数据的事件(如:翻页),能够触发accpet方法
-
参考代码:
public class BounsTypeListPlugin extends AbstractFormPlugin implements Consumer<PackageDataEvent>{
final static String OPT_KEY_PUBLISH = "publish";
final static String OPT_KEY_DELETE_ROW = "deleterow";
final static String OPT_KEY_CANCEL = "cancel";
final static String OPT_KEY_PUBLISH_AGAIN = "publishagain";
final static String selectField = "id, name, status";
private final String table = "billlistap";
@Override
public void registerListener(EventObject e) {
EntryGrid billList = this.getControl(table);
billList.addPackageDataListener(this);
}
@Override
public void afterCreateNewData(EventObject e) {
EntryGrid billList = this.getControl(table);
billList.addPackageDataListener(this);
billList.addDataBindListener(this);
setData();
}
private void setData() {
DynamicObject[] dynamicObjects = queryData();
this.getModel().deleteEntryData(table);
//赋值
if(dynamicObjects != null && dynamicObjects.length > 0){
this.getModel().batchCreateNewEntryRow(table, dynamicObjects.length);
DynamicObjectCollection entryEntity = this.getModel().getEntryEntity(table);
int i = 0;
for(DynamicObject bounsType : entryEntity){
DynamicObject dynamicObject = dynamicObjects[i++];
bounsType.set(BounsTypeEntity.ID, dynamicObject.getString(BounsTypeEntity.ID));
bounsType.set(BounsTypeEntity.NAME, dynamicObject.getString(BounsTypeEntity.NAME));
// 状态
String status = dynamicObject.getString(BounsTypeEntity.STATUS);
bounsType.set(BounsTypeEntity.STATUS, status);
}
}
this.getView().updateView(table);
}
@Override
public void accept(PackageDataEvent e) {
Object obj = e.getSource();
// 获取当前行数据
DynamicObject rowData = e.getRowData();
String status = rowData.getString("status");
if (obj instanceof OperationColumn) {
List<OperationColItem> operationColItems = (List<OperationColItem>) e.getFormatValue();
for (OperationColItem item : operationColItems) {
String operationKey = item.getOperationKey();
if (BounsTypeEntity.STATUS_DRAFT.equals(status)) {
//草稿状态只显示 删除 / 发布 两个操作
if( !operationKey.equals(OPT_KEY_DELETE_ROW) && !operationKey.equals(OPT_KEY_PUBLISH)){
item.setVisible(false);
}
}
}
}
}
}