电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

苍穹开发系列之二:动态生成控件要点

来源:金蝶云社区作者:金蝶2024-09-163

苍穹开发系列之二:动态生成控件要点

一、问题描述/需求描述:

有时候控件不可直接预置,需要通过插件动态设置。或根据实际场景加载不同控件的情况。

二、思路与方案:

    通过插件根据需要动态加载不同的控件

三、实现过程:

3.1 onGetControl

在用户与自定义控件交互时触发,创建自定义控件的编程模型并监听事件(TextEdit、IntegerEdit、ComboEdit等)

3.2. loadCustomControlMetas、beforeBindData

loadCustomControlMetas方法,控制自定义控件是否在前端浏览器中显示。

beforeBindData方法,控制自定义控件是否在后端模型中存在。

两者需保持一致,建议封装同一个创建自定义控件的方法,在loadCustomControlMetas和beforeBindData中共同调用

具体步骤:

1.先创建一个Flex容器FlexPanelAp

2.创建一个FieldAp并设置通用属性

3.再根据实际需要生成的字段,创建TextField、IntegerField等字段类型

4.调用FieldAp的setField方法,添加TextField、IntegerField等具体的字段类型

5.调用FlexPanelAp的getItems().add,添加FieldAp

3.3 getEntityType

创建TextProp、IntegerProp、ComboProp等字段属性。通过调用registerSimpleProperty方法,向界面主实体模型中注册自定义控件的属性,再通过setNewEntityType方法回传给系统。






代码示例:

package kd.bos.plugin.sample.dynamicform.pcform.form.bizcase;
import java.util.EventObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.EntryType;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.datamodel.events.BizDataEventArgs;
import kd.bos.entity.datamodel.events.GetEntityTypeEventArgs;
import kd.bos.entity.property.TextProp;
import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDException;
import kd.bos.form.ClientProperties;
import kd.bos.form.container.Container;
import kd.bos.form.control.Button;
import kd.bos.form.control.Control;
import kd.bos.form.control.EntryGrid;
import kd.bos.form.control.events.ClickListener;
import kd.bos.form.events.LoadCustomControlMetasArgs;
import kd.bos.form.events.OnGetControlArgs;
import kd.bos.form.field.TextEdit;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.metadata.entity.commonfield.TextField;
import kd.bos.metadata.form.container.FlexPanelAp;
import kd.bos.metadata.form.control.ButtonAp;
import kd.bos.metadata.form.control.EntryAp;
import kd.bos.metadata.form.control.EntryFieldAp;
import kd.bos.metadata.form.control.FieldAp;
public class LoadCustomControlMetasSample extends AbstractFormPlugin implements ClickListener {	
	private final static String KEY_ENTRYENTITY = "entryentity";	
	private final static String KEY_MYFIELDCONTAINER = "myfieldcontainer";	
	private final static String KEY_AUTOTEXT1 = "autotext1";	
	private final static String KEY_AUTOTEXT2 = "autotext2";	
	private final static String KEY_AUTOBUTTON1 = "autobutton1";	
	/**
	 * 界面显示前,触发此事件:向前端界面输出动态添加的字段、控件
	 * @remark
	 * 这个事件只能向前端界面添加字段、控件;后台的视图模型、数据模型,均没有改变
	 */
	@Override
	public void loadCustomControlMetas(LoadCustomControlMetasArgs e) {		
	super.loadCustomControlMetas(e);		
		// 动态添加单据头字段、按钮
		FlexPanelAp headAp = this.createDynamicPanel();
		Map<String, Object> mapHead = new HashMap<>();
		mapHead.put(ClientProperties.Id, KEY_MYFIELDCONTAINER);
		mapHead.put(ClientProperties.Items, headAp.createControl().get(ClientProperties.Items));
		e.getItems().add(mapHead);		
		// 动态添加单据体字段
		EntryAp entryAp = this.createDynamicEntryAp();
		Map<String, Object> mapEntry = new HashMap<>();
		mapEntry.put(ClientProperties.Id, KEY_ENTRYENTITY);
		mapEntry.put(ClientProperties.Columns, entryAp.createControl().get(ClientProperties.Columns));
		e.getItems().add(mapEntry);
	}	
	/**
	 * 此事件在系统要用到表单主实体模型时触发
	 * @param e
	 * @remark
	 * 插件修改原始主实体,注册自定义属性,返回新的主实体给系统
	 */
	@Override
	public void getEntityType(GetEntityTypeEventArgs e) {		
		// 取原始的主实体
		MainEntityType oldMainType = e.getOriginalEntityType();		// 复制主实体
		MainEntityType newMainType = null;		
		try{
			newMainType = (MainEntityType)oldMainType.clone();
		}		
		catch (CloneNotSupportedException exp){			
		    throw new KDException(exp, new ErrorCode("LoadCustomControlMetasSample", exp.getMessage()));
		}		
		// 为自定义的文本字段,向主实体注册文本属性
		this.registDynamicProps(newMainType);		
		// 回传主实体给系统
		e.setNewEntityType(newMainType);
	}	/**
	 * 此事件在表单创建界面数据包时触发
	 * @remark
	 * 由插件自行创建界面数据包,包含自定义字段
	 */
	@Override
	public void createNewData(BizDataEventArgs e) {
		
		DynamicObject dataEntity = new DynamicObject(this.getModel().getDataEntityType());
		dataEntity.set(KEY_AUTOTEXT1, "动态文本字段1的值");
		
		DynamicObjectCollection rows = dataEntity.getDynamicObjectCollection(KEY_ENTRYENTITY);
		DynamicObject newRow = new DynamicObject(rows.getDynamicObjectType());
		newRow.set(KEY_AUTOTEXT2, "动态文本字段2的值");
		
		rows.add(newRow);
		
		e.setDataEntity(dataEntity);
	}	
	/**
	 * 此事件在把数据绑定到界面之前触发:
	 * 系统会调用FormDataBinder对象,把字段值输出给前端字段编辑控件;
	 * @param e
	 * @remark
	 * 动态添加的字段,在FormDataBinder中并没有记录,因此,默认不会绑定动态添加的字段值;
	 * 必须在此事件,向FormDataBinder中注册动态添加的字段
	 */
	@Override
	public void beforeBindData(EventObject e) {		
		// 单据头添加的字段、控件,注入到容器面板的控件编程模型中
		FlexPanelAp dynamicPanel = this.createDynamicPanel();
		Container myFldPanel = this.getView().getControl(KEY_MYFIELDCONTAINER);
		myFldPanel.getItems().addAll(dynamicPanel.buildRuntimeControl().getItems());		this.getView().createControlIndex(myFldPanel.getItems());		
		// 单据体添加的字段,注入到单据体表格的控件编程模型中
		EntryAp dynamicEntryAp = this.createDynamicEntryAp();
		EntryGrid entryGrid = this.getView().getControl(KEY_ENTRYENTITY);
		List<Control> fieldEdits = dynamicEntryAp.buildRuntimeControl().getItems();		for(Control fieldEdit : fieldEdits){
			fieldEdit.setView(this.getView());
	

苍穹开发系列之二:动态生成控件要点

一、问题描述/需求描述:有时候控件不可直接预置,需要通过插件动态设置。或根据实际场景加载不同控件的情况。二、思路与方案: 通过插...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信