如何实现树形基础资料在移动端树形显示时只能选择叶子节点原创
金蝶云社区-wbshcy
wbshcy
10人赞赏了该文章 4,591次浏览 未经作者许可,禁止转载编辑于2022年06月09日 15:05:32
summary-icon摘要由AI智能服务提供

文本介绍了在移动端处理树形基础资料数据时,需求是树形显示并仅允许选择叶子节点的实现方案。由于直接过滤叶子节点无法构建树形结构,故提出了两种实现方案:一是通过继承模板并注册插件来控制只能选择叶子节点;二是动态给特定移动F7界面注册插件实现相同功能。文本详细说明了两种方案的实现步骤,包括模板继承、插件编写、事件监听和参数传递等。最终实现了树形展示且仅可选择叶子节点的效果,并指出了开发环境版本和参考资料。


关键字:树形基础资料、移动端、叶子节点

一、需求

在移动端选择某种树形基础资料数据时,需要树形显示,且只能选择叶子节点,其他非叶子节点显示出来但是不可选择。

二、思路与方案

如果直接配置过滤条件“isleaf=1”,由于过滤出来的数据没有包含上级数据,导致移动端无法构造树形结构,F7界面会显示空白,而MobileTreeList有setOnlySelectLeaf(true)方法可以控制只能选择叶子节点(移动树形列表f7上面就只有一个移动树形列表mobiletreelistap这个控件,所以就找对应的编程MobileTreeList看看有没有接口才发现有setOnlySelectLeaf(true)),但是需求是只有某个单据的这个树形基础资料才需要实现以上需求,所以需要在树形基础资料模板bos_mobtreelistf7继承一个模板来进行控制或者给bos_mobtreelistf7动态注册插件来实现。

三、实现过程

实现方案继承模板生成新的移动树形列表f7页面

1.准备一个树形基础资料如下图,找一个单据配置基础资料字段绑定这个树形基础资料,单据的移动表单配置上这个基础资料字段。

 image.png

 

2.在模板mobtreelistf7上继承出来一个新的模板,命名为:kded_mobonlyleafselect,然后注册插件。

 

1.png

插件代码如下:

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的插件。

3.png

 

补充:

方案一由于是自己构造FormShowParameter,会导致没有原来的过滤条件,可在beforeF7select事件把原来FormShowParameter的过滤条件赋给新的FormShowParameter解决该问题。

实现方案动态给树形基础资料移动F7界面注册插件

1.确定打开的树形F7选择界面的标识,在kd.bos.mvc.form.FormView.showForm(FormShowParameter)打断点去看formid,比如是bos_mobtreelistf7。另外看下ParentFormId是多少,后面要用到。

 

1.png


2.确认上一步找到的界面有移动树形列表控件,如图,如没有这个控件,只能用实现方案1了。

 

4.png

3.扩展第1步找到的界面,并注册插件

 image.png

image.png

 

插件代码如下:

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();
}
}

四、实现效果

可显示树形结构,但只能选择叶子节点的数据

 image.png


五、开发环境版本

V4.0.0.14

、参考资料

弹窗实现以及父子页面传参

界面参数构造


图标赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!