文本介绍了在移动端处理树形基础资料数据时,需求是树形显示并仅允许选择叶子节点的实现方案。由于直接过滤叶子节点无法构建树形结构,故提出了两种实现方案:一是通过继承模板并注册插件来控制只能选择叶子节点;二是动态给特定移动F7界面注册插件实现相同功能。文本详细说明了两种方案的实现步骤,包括模板继承、插件编写、事件监听和参数传递等。最终实现了树形展示且仅可选择叶子节点的效果,并指出了开发环境版本和参考资料。
关键字:树形基础资料、移动端、叶子节点
一、需求
在移动端选择某种树形基础资料数据时,需要树形显示,且只能选择叶子节点,其他非叶子节点显示出来但是不可选择。
二、思路与方案
如果直接配置过滤条件“isleaf=1”,由于过滤出来的数据没有包含上级数据,导致移动端无法构造树形结构,F7界面会显示空白,而MobileTreeList有setOnlySelectLeaf(true)方法可以控制只能选择叶子节点(移动树形列表f7上面就只有一个移动树形列表mobiletreelistap这个控件,所以就找对应的编程MobileTreeList看看有没有接口才发现有setOnlySelectLeaf(true)),但是需求是只有某个单据的这个树形基础资料才需要实现以上需求,所以需要在树形基础资料模板bos_mobtreelistf7继承一个模板来进行控制或者给bos_mobtreelistf7动态注册插件来实现。
三、实现过程
实现方案一:继承模板生成新的移动树形列表f7页面
1.准备一个树形基础资料如下图,找一个单据配置基础资料字段绑定这个树形基础资料,单据的移动表单配置上这个基础资料字段。
2.在模板mobtreelistf7上继承出来一个新的模板,命名为:kded_mobonlyleafselect,然后注册插件。
插件代码如下:
package officesys; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.list.MobileTreeList; public class mobiletreelisthcyplugin extends AbstractFormPlugin { @Override public void afterBindData(EventObject e) { // TODO Auto-generated method stub super.afterBindData(e); MobileTreeList mobiletreeList = (MobileTreeList)this.getControl("mobiletreelistap"); //控制只能选择叶子节点 mobiletreeList.setOnlySelectLeaf(true); } } }
3.给移动表单的基础资料控件设置beforeF7Select监听,然后在beforeF7Select事件取消原来要打开的界面,自己构造FormShowParameter打开。
public class OfficeMobilePlugin extends AbstractMobBillPlugIn implements BeforeF7SelectListener { @Override public void registerListener(EventObject e) { // TODO Auto-generated method stub super.registerListener(e); //给基础资料控件设置beforeF7Select监听 BasedataEdit tree=this.getControl("kded_wupintree"); tree.addBeforeF7SelectListener(this); } } @Override public void beforeF7Select(BeforeF7SelectEvent paramBeforeF7SelectEvent) { // TODO Auto-generated method stub if("kded_wupintree".equals(paramBeforeF7SelectEvent.getProperty().getName())) { //取消原来的打开页面 paramBeforeF7SelectEvent.setCancel(true); //获取树形基础资料的单据参数 BillParam billParam = ParameterHelper.getBillParam("kded_wupintree"); //构造FormShowParameter ,这里的“kded_wupintree”是基础资料的控件标识 FormShowParameter param = ShowFormHelper.createMobileTreeListF7ShowForm("kded_wupintree", (ListShowParameter)paramBeforeF7SelectEvent.getFormShowParameter(), billParam.getMobileListF7Config().getPrimaryField(), billParam.getMobileListF7Config().getPageRow()); //设置打开的移动F7界面列表的模板为我们新继承出来的模板 param.setFormId("kded_mobonlyleafselect"); param.setCustomParam("showFrequent", true); paramBeforeF7SelectEvent.setFormShowParameter(param); this.getView().showForm(param); } } }
4.给单据的移动表单注册步骤3的插件。
补充:
方案一由于是自己构造FormShowParameter,会导致没有原来的过滤条件,可在beforeF7select事件把原来FormShowParameter的过滤条件赋给新的FormShowParameter解决该问题。
实现方案二:动态给树形基础资料移动F7界面注册插件
1.确定打开的树形F7选择界面的标识,在kd.bos.mvc.form.FormView.showForm(FormShowParameter)打断点去看formid,比如是bos_mobtreelistf7。另外看下ParentFormId是多少,后面要用到。
2.确认上一步找到的界面有移动树形列表控件,如图,如没有这个控件,只能用实现方案1了。
3.扩展第1步找到的界面,并注册插件
插件代码如下:
package officesys; import kd.bos.form.FormShowParameter; import kd.bos.form.events.PreOpenFormEventArgs; import kd.bos.form.plugin.AbstractFormPlugin; public class MobileTreehcyPlugin extends AbstractFormPlugin { @Override public void preOpenForm(PreOpenFormEventArgs e) { // TODO Auto-generated method stub super.preOpenForm(e); FormShowParameter formparam=e.getFormShowParameter(); //XXX为第1步找到的ParentFormId() if("XXX".equals(formparam.getParentFormId())) { //动态注册插件 formparam.addCustPlugin("officesys.mobiletreelisthcyplugin"); } } }
package officesys; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.list.MobileTreeList; public class mobiletreelisthcyplugin extends AbstractFormPlugin { @Override public void initialize() { MobileTreeList mobiletreeList = (MobileTreeList)this.getControl("mobiletreelistap"); mobiletreeList.setOnlySelectLeaf(true); super.initialize(); } }
四、实现效果
可显示树形结构,但只能选择叶子节点的数据
五、开发环境版本
V4.0.0.14
六、参考资料
推荐阅读