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


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

一、需求

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

二、思路与方案

如果直接配置过滤条件“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