在bos开发中要对f7控件进行甚至过滤条件,有以下几种情况:表头F7控件、分录F7控件(界面纯表格)、分录F7控件(调用基础资料LISTUI,左树右表)
1.表头F7控件
EntityViewInfo entityViewInfo = new EntityViewInfo();
FilterInfo filterInfo = new FilterInfo(); // 建立过滤条件
filterInfo.getFilterItems().add(new FilterItemInfo("deletedStatus", 1, CompareType.GREATER_EQUALS));
entityViewInfo.setFilter(filterInfo);
prmtF7.setEntityViewInfo(entityViewInfo);
2. 分录F7控件(界面纯表格)
与表头F7控件差不多,先获取单元格编辑控件,再进行相应的设置
Object obj = kdtEntrys.getColumn("supplier").getEditor().getComponent();
if(obj instanceof KDBizPromptBox){
KDBizPromptBox prmtF7 = (KDBizPromptBox)obj;
EntityViewInfo entityViewInfo = new EntityViewInfo();
FilterInfo filterInfo = new FilterInfo();
filterInfo.getFilterItems().add(new FilterItemInfo("deletedStatus",1, CompareType.EQUALS));
entityViewInfo.setFilter(filterInfo);
prmtF7.setEntityViewInfo(entityViewInfo);
}
3.分录F7控件(调用基础资料LISTUI,左树右表)
这种情况比较复杂,先查看抽象类生产的代码:
kdtEntrys_supplier_PromptBox.addSelectorListener(new SelectorListener() {
com.kingdee.eas.ors.basedata.master.client.ViewPointListUI kdtEntrys_supplier_PromptBox_F7ListUI = null;
public void willShow(SelectorEvent e) {
if (kdtEntrys_supplier_PromptBox_F7ListUI == null) {
try {
kdtEntrys_supplier_PromptBox_F7ListUI = new com.kingdee.eas.ors.basedata.master.client.ViewPointListUI();
} catch (Exception e1) {
e1.printStackTrace();
}
HashMap ctx = new HashMap();
ctx.put("bizUIOwner",javax.swing.SwingUtilities.getWindowAncestor(kdtEntrys_supplier_PromptBox_F7ListUI));
kdtEntrys_supplier_PromptBox_F7ListUI.setF7Use(true,ctx);
kdtEntrys_supplier_PromptBox.setSelector(kdtEntrys_supplier_PromptBox_F7ListUI);
}
}
});
查看代码发现,左树右表基础资料调用的是基础资料ListUI界面,
kdtEntrys_supplier_PromptBox_F7ListUI.setF7Use(true,ctx);
ctx为Map类型,可以传递各种类型数据,其中可以把过滤条件加入此处,通过查阅 setF7Use方法代码有如下代码:
f7Delegate = new com.kingdee.eas.framework.client.F7Render(this, ctx);
通过反编译可以看到F7Render类为封装类,代码如下:
public void init()
throws Exception
{
if(ctx != null)
{
isF7Use = true;
f7Filter = (EntityViewInfo)ctx.get("EntityViewInfo");
if(ctx.get("HasCUDefaultFilter") != null)
……
弄清原由了,可以进行相应的设置.
根据业务需求,在F7控件调用时过滤的已禁用的基础资料,而在基础资料列表中又需全部显示以便维护?
经上分析,可以清楚F7控件过滤条件传递过程,现在用另外一方式实现:
假设:基础资料为BaseListUI.ui--->BaseListUI.java BaseEditUI.java
第一步:基础资料BaseListUI.java覆盖抽象类AbstractBaseListUI.java中的setF7Use(true,ctx)方法:
public void setF7Use(boolean isF7Use, HashMap ctx) {
isF7ListUI = true;//标记是F7控件调用还是基础资料List
super.setF7Use(isF7Use, ctx);
}
第二步:过滤ListUI数据,覆盖getDefaultEntityViewInfo()方法:
protected EntityViewInfo getDefaultEntityViewInfo() {
if(isF7ListUI){
EntityViewInfo ewinfo = new EntityViewInfo();
FilterInfo vwFilter = new FilterInfo();
vwFilter.getFilterItems().add(new FilterItemInfo("deletedStatus",1, CompareType.EQUALS));
ewinfo.setFilter(vwFilter);
return ewinfo;
}else{
return super.getDefaultEntityViewInfo();
}
}
顺利完成!
通过debug分析,执行类顺序: setF7Use-->getDefaultEntityViewInfo-->onload