如何实现F7列表列字段的动态显示原创
金蝶云社区-陈来珍
陈来珍
4人赞赏了该文章 1,161次浏览 未经作者许可,禁止转载编辑于2022年10月19日 15:47:40

关键词:F7列表、动态列

一、需求

    采购订单(kded_oderbill)中,如果采购组织不为空,则弹出基础资料资料F7列表中,动态显示基础资料的批次和申请日期这两个字段

image.png

image.png

二、思路与方案

    在基础资料选择前beforeF7Select事件中,判断条件是否成立,条件成立时,获取弹窗的FormShowParameter参数传递要添加的列的字段名给F7列表。然后再在基础资料的列表插件中判断传过来的参数,在beforeCreateListColumns事件中动态设置要添加的列。

三、实现过程

1、单据插件中,打开基础资料F7列表前,传递参数

public class AddF7FieldPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener{
	
	@Override
	public void registerListener(EventObject e) {
		BasedataEdit bedit = this.getView().getControl("kded_basedatafield");
		bedit.addBeforeF7SelectListener(this);
		super.registerListener(e);
	}

	@Override
	public void beforeF7Select(BeforeF7SelectEvent arg0) {
		if (arg0.getProperty().getName().equals("kded_basedatafield")&&this.getModel().getValue("kded_orgfield")!=null) {
			FormShowParameter fsp = arg0.getFormShowParameter();
			Map<String, Object> addFields = new HashMap<>();
			ArrayList<String> fields = new ArrayList<String>();
			fields.add("kded_textfield");
			fields.add("kded_datefield");
			addFields.put("addFields", fields);
			fsp.setCustomParams(addFields);
		}
	}
}

2、基础资料列表插件中,动态添加列

public class AddFieldListPlugin extends AbstractListPlugin {
	@Override
	public void beforeCreateListColumns(BeforeCreateListColumnsArgs args) {
		Map<String, Object> addFields = this.getView().getFormShowParameter().getCustomParams();
		JSONArray fields = (JSONArray) addFields.get("addFields");
		if (fields == null) {
			return;
		}
		for (int i = 0; i < fields.size(); i++) {
			String field = fields.get(i).toString();
			if (field.equals("kded_textfield")) {
				ListColumn colText1 = this.createListColumn(field, "批次");
				args.addListColumn(colText1);
			} else if (field.equals("kded_datefield")) {
				ListColumn colText1 = this.createListColumn(field, "申请日期");
				args.addListColumn(colText1);
			}

		}
		super.beforeCreateListColumns(args);
	}

	/**
	 * 创建列对象返回
	 *
	 * @param key
	 *            列标识,需要显示的字段,如"textfield"、 "basedatafield.name",
	 *            即实体中存在的字段标识。
	 * @param caption
	 *            列标题
	 * @return
	 */
	private ListColumn createListColumn(String key, String caption) {

		ListColumn col = new ListColumn();

		col.setCaption(new LocaleString(caption));
		col.setKey(key);
		col.setListFieldKey(key);

		return col;
	}
}

四、效果图

image.png

五、开发环境版本

V5.0.002

六、参考资料

开发平台

学习成长中心


赞 4