如何实现页签控件,添加子页签的功能原创
金蝶云社区-吴锐雄
吴锐雄
5人赞赏了该文章 1716次浏览 未经作者许可,禁止转载编辑于2023年01月12日 22:46:46


关键词:页签


一、需求

页签控件添加子页签。

由于通过代码添加控件的方式比较复杂,而且添加的子页签属于静态页签,无法关闭,所以需要通过其他方式来添加子页签控件。


二、思路与方案

页签控件可以用showForm的方式也能实现打开子页签。

1.设计页面,调整页签控件的页签风格为“默认

2.注册插件,编写 打开子页签的插件代码。

3.在插件代码中实现关闭其他页签、关闭全部页签功能


三、实现过程

1.设计页面

在设计器中添加页面,kdec_wrxtest_tab。

添加一个页签控件。

image.png


调整页签风格为“默认

image.png


我放置了3个按钮打开三个单据列表

image.png

2.实现打开子页签的功能。

添加插件

image.png



插件关键代码如下

在ShowParameter中设置展示方式为NewTabPage;设置展示目标控件标识。

    listShowParameter.getOpenStyle().setShowType(ShowType.NewTabPage);
    listShowParameter.getOpenStyle().setTargetKey("kdec_tabap");


代码如下

@Override
public void registerListener(EventObject e) {
    super.registerListener(e);
    addClickListeners("kdec_test", "kdec_open_tl", "kdec_open_mt", "kdec_open_st");
}

@Override
public void click(EventObject evt) {
    super.click(evt);

    if (evt.getSource() instanceof Button) {
        switch (((Button) evt.getSource()).getKey()) {
            case "kdec_open_tl":
                showParameter("kdec_textline_bill");
                break;
            case "kdec_open_mt":
                showParameter("kdec_material");
                break;
            case "kdec_open_st":
                showParameter("kdec_contexture");
                break;
        }
    }
}

private void showParameter (String billKey) {
    ListShowParameter listShowParameter = new ListShowParameter();
    // 单机列表模板标识(固定写法)
    listShowParameter.setFormId("bos_list");
    listShowParameter.setBillFormId(billKey);
    listShowParameter.getOpenStyle().setShowType(ShowType.NewTabPage);
    //设置TargetKey,这里传入页签控件的标识
    listShowParameter.getOpenStyle().setTargetKey("kdec_tabap");
    IFormView view = getView();
    view.showForm(listShowParameter);
}



3.实现关闭其他页签、关闭全部页签功能

接上述第二点,如果点击“关闭其他页签”、“关闭全部页签”,会发现没有效果,并不会关闭。

我们需要在插件代码中实现:

@Override
public void registerListener(EventObject e) {
    super.registerListener(e);
    Tab tab = getControl("kdec_tabap");
    tab.addTabCloseListener(this);
}

@Override
public void tabClose(TabCloseEvent tabCloseEvent) {
    List<String> tabKeys = tabCloseEvent.getTabKeys();
    List<Map<String, String>> tabListClose = new ArrayList(10);
    Iterator var4 = tabKeys.iterator();

    while(var4.hasNext()) {
        String tabKey = (String)var4.next();
        IFormView formView = SessionManager.getCurrent().getViewNoPlugin(tabKey);
        formView.close();
        HashMap<String, String> arg = new HashMap();
        arg.put("pageId", tabKey);
        tabListClose.add(arg);
    }

    IClientViewProxy clientViewProxy = getView().getService(IClientViewProxy.class);
    clientViewProxy.addAction("closeWindow", tabListClose);

}


四、效果图

调整为默认之后,会有2个效果,出现一个X,提供给用户进行关闭;右键点击,可以出现关闭页签。

image.png

image.png


五、开发环境版本

image.png


六、注意事项

1.除非必要,勿要在页签控件上添加固定的子页签,在关闭其他页签时,是没有办法关闭固定页签的。

如下图,我在页签控件上添加了2个静态的子页签,这两个子页签是无法关闭的,即常驻在页签控件上。

image.png

image.png


2.关于页签控件的一些使用方法,也可以参考首页默认插件的实现方式:

kd.bos.portal.plugin.BizAppHomePlugin

image.png


页签控件


八、附件

附件说明:

插件代码:DemoTestControlTabPlugin.java

元数据zip包:kdec_wrx_test-kdec_wrx_col_app-20221220164527.zip

元数据说明

业务云编码:kdec_wrx_test;应用编码:kdec_wrx_col_app;页面:kdec_wrxtest_tab;

赞 5