分录F7控件过滤-基础资料ListUI左树右表

 

1.单据-出口商品登记分录:F7字段“版本号”(versionNum)

2.基础资料-版本号:左树右表结构,编辑UI:VersionNumberEditUI,

序时薄UI: VersionNumberListUI

其中版本号包含商品、账册序号。

 

需求:根据分录的商品、账册序号过滤版本号。

 

 

尝试1:

字段“版本号”绑定分录对应的实体versionNum字段,单据抽象类方法jbInit()中自动生成如下代码:

final KDBizPromptBox prmtVersionNum = (KDBizPromptBox) kdtEntrys.getColumn("versionNum").getEditor().getComponent();

    prmtVersionNum.addSelectorListener(new SelectorListener(){

VersionNumberListUI kdtEntrys_versionNum_PromptBox_F7ListUI = null;

public void willShow(SelectorEvent e) {

                    if (kdtEntrys_versionNum_PromptBox_F7ListUI == null) {

                    try {

                        kdtEntrys_versionNum_PromptBox_F7ListUI = new VersionNumberListUI();

                        HashMap ctx = new HashMap();

                        ctx.put("bizUIOwner",javax.swing.SwingUtilities.getWindowAncestor(kdtEntrys_versionNum_PromptBox_F7ListUI));                      kdtEntrys_versionNum_PromptBox_F7ListUI.setF7Use(true,ctx);             prmtVersionNum.setSelector(kdtEntrys_versionNum_PromptBox_F7ListUI);

                    } catch (Exception e1) {

                        e1.printStackTrace();

                    }

                }

            }

    });

 

上述代码语句无法在单据继承里面重写,因此无法将分录当前行的商品、账册序号传递给基础资料-版本号,无法实现条件过滤。

 

尝试2:

直接更改分录列“版本号”控件的queryInfo,调试得知:单据抽象类里面已经添加该列的SelectorListener事件,因此无法干涉其过滤。

 

尝试3:

在单据继承类重写该列的SelectorListener事件,同时将自定义的过滤条件传递给版本号ListUI,

逻辑貌似可以,经尝试,过滤条件能够正常传递过去,同时过滤条件也可以起作用。

缺点:打开单据界面,首次“版本号”F7选择时,过滤条件不起作用,其后的F7选择时都可以成功过滤。

原因:单据继承类重写了该列的SelectorListener事件,同时单据抽象类里面也实现了该列的SelectorListener事件。程序运行时首次加载重写的SelectorListener事件,其次加载抽象类实现的SelectorListener事件,此时将之前传递的自定义过滤冲掉了。

单据抽象类创建版本号ListUI实例是在willShow方法外面,其对应的实例为类变量。单据继承类创建版本号ListUI实例需要在willShow方法里面,其对应的实例为局部变量,每次调用都创建一个实例。虽然单据继承类多次创建ListUI实例,其实都是指向同一个存储地址(抽象类实现的SelectorListener事件时内存所分配的存储地址)。因此出现上述缺点(该缺点客户是无法容忍的)。

 

分析:

只要将字段“版本号”绑定分录对应的实体versionNum字段,单据抽象类就自动添加其SelectorListener事件,因此设想将其移除,在继承类里面添加SelectorListener事件,同时将自定义的过滤条件传递给版本号,就可以解决。

 

解决方案:

 

1.        手动绑定“版本号”、手动加载“版本号”:

单据继承类的loadFields方法中:

dataBinder.registerBinding("entrys.versionNum",  com.kingdee.eas.hl.basedata.VersionNumberInfo.class,this.kdtEntrys, "versionNum.text");

 

//版本号需要手动加载

        int rowCount = kdtEntrys.getRowCount();

        for(int i =0;i<rowCount;i++){

        IRow row = kdtEntrys.getRow(i);

        ExpGoodsInputEntryInfo entryInfo = (ExpGoodsInputEntryInfo) row.getUserObject();

        if(null == entryInfo)

             continue;

        row.getCell("versionNum").setValue(entryInfo.getVersionNum());

        }

2.        手动创建F7控件:

单据继承类的onLoad方法中:

//版本号

    KDBizPromptBox prmtVersionNum = new KDBizPromptBox();

     prmtVersionNum.setQueryInfo("com.kingdee.eas.hl.basedata.app.VersionNumberQuery");

        prmtVersionNum.setVisible(true);

        prmtVersionNum.setEditable(true);

        prmtVersionNum.setDisplayFormat("$name$");

        prmtVersionNum.setEditFormat("$number$");

        prmtVersionNum.setCommitFormat("$number$");

        KDTDefaultCellEditor kdtEntrys_versionNum_CellEditor = new KDTDefaultCellEditor(prmtVersionNum);

   kdtEntrys.getColumn("versionNum").setEditor(kdtEntrys_versionNum_CellEditor);

        ObjectValueRender kdtEntrys_versionNum_OVR = new ObjectValueRender();

        kdtEntrys_versionNum_OVR.setFormat(new BizDataFormat("$name$"));

     kdtEntrys.getColumn("versionNum").setRenderer(kdtEntrys_versionNum_OVR);

 

3.     手动添加列“版本号”的SelectorListener事件:

单据继承类的initListener方法中:

 

 

final KDBizPromptBox prmtVersionNum = (KDBizPromptBox) kdtEntrys.getColumn("versionNum").getEditor().getComponent();

    prmtVersionNum.addSelectorListener(new SelectorListener(){

            public void willShow(SelectorEvent e) {

//切记该实例需在willShow方法里面创建,否则无法将各个分录行的过滤条件传递给基础资料ListUI

        VersionNumberListUI kdtEntrys_versionNum_PromptBox_F7ListUI = null;

            if (kdtEntrys_versionNum_PromptBox_F7ListUI == null) {

                    try {

                        kdtEntrys_versionNum_PromptBox_F7ListUI = new VersionNumberListUI();

                        HashMap ctx = new HashMap();

                        ctx.put("bizUIOwner",javax.swing.SwingUtilities.getWindowAncestor(kdtEntrys_versionNum_PromptBox_F7ListUI));

                        ctx.put("eviF7",versionNumevi);

                        kdtEntrys_versionNum_PromptBox_F7ListUI.setF7Use(true,ctx);

                        prmtVersionNum.setSelector(kdtEntrys_versionNum_PromptBox_F7ListUI);

                    } catch (Exception e1) {

                        e1.printStackTrace();

                    }

                }

            }

    });

 

其中versionNumevi为全局变量,由表kdtEntrys的editStarting触发“版本号”列时赋值。

 

4.     实现kdtEntrys的editStarting触发事件:

 

if(kdtEntrys.getColumnIndex("versionNum") == colIndex){//版本号

         GoodsInfo goodsInfo = (GoodsInfo) row.getCell("goods").getValue();

         if(null == goodsInfo){

             MsgBox.showWarning(this,"商品编号不允许为空!");

             kdtEntrys.getEditManager().editCellAt(rowIndex, kdtEntrys.getColumnIndex("goods"));

             abort();

         }

         AccountBookSeqInfo accBookSeqInfo = (AccountBookSeqInfo) row.getCell("accBookSeq").getValue();

         filter.getFilterItems().add(new FilterItemInfo("goods.id",goodsInfo.getId().toString()));

         if(null != accBookSeqInfo && null != accBookSeqInfo.getId()){

             filter.getFilterItems().add(new FilterItemInfo("accountBook.id",accBookSeqInfo.getId().toString()));

         }

         filter.getFilterItems().add(new FilterItemInfo("isUsed",new Integer(1)));

         evi.setFilter(filter);

         versionNumevi = evi;//为全局变量versionNumevi赋值

    }

 

上述4步为单据继承类要实现的代码。

 

5.        基础资料-版本号ListUI需要添加的代码如下:

 

1>      重写方法setF7Use

 

@Override

    public void setF7Use(boolean isF7Use, HashMap ctx) {

    isF7ListUI = true;

    EntityViewInfo evi = (EntityViewInfo) ctx.get("eviF7");//由单据传递过来的EVI

    if(null !=evi){

         eviF7 = evi;

    }

    super.setF7Use(isF7Use, ctx);

 }

2>      重写方法getDefaultEntityViewInfo

 

@Override

    protected EntityViewInfo getDefaultEntityViewInfo() {

    if(isF7ListUI){

         if(null == eviF7){

             return super.getDefaultEntityViewInfo();

         }else{

             return eviF7;

         }

    }else{

         return super.getDefaultEntityViewInfo();

     }

}

其中isF7ListUI、eviF7均为全局变量。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值