在开发中,我们遇到以下一个需求。

一个表格左侧有5列是固定存在的,右侧有N列是动态生成的,并且该N列中第一列可输入,第二列是不可编辑的,但是是数字,如果小于0,那么就要显示为红色,重点标识出来。

首先,我们假设你的VO中的SQL查询已经做好了,并且每次能动态确定到需要插入几列。

//获得你要生成的列总数
int n=Integer.valueOf(String.valueOf(am.invokeMethod("getCloumnCount"))) ;
OATableBean tableBean = (OATableBean)webBean.findChildRecursive("tableRN");
//创建第1个动态列列单元格
//createWebBean有很多参数,有兴趣的可以翻一翻官方文档
OAMessageTextInputBean cellOneBean= (OAMessageTextInputBean)this.createWebBean(pageContext,
OAMessageTextInputBean.MESSAGE_TEXT_INPUT_BEAN,
null,
"Cell1"
);
cellOneBean.setViewUsageName("XxxxVO1");//此列绑定的VO
cellOneBean.setViewAttributeName("prodType1");//此列绑定的VO中的字段
cellOneBean.setLabel("第1个动态单元格"); //此列需要显示的题头 //DisableFlag是你在VO中的叫DisableFlag的字段,根据某些条件在VORowImpl中返回true或者false
//其用法类似于在页面上设置某个组件的属性 Disable = ${oa.current.DisabledFlag}
OADataBoundValueViewObject Disabled = new OADataBoundValueViewObject(cellOneBean,"DiabledFlag");
cellOneBean.setAttributeValue(this.DISABLED_ATTR,Disabled); tableBean.addIndexedChild(cellOneBean); //创建第2个动态列单元格
OAMessageStyledTextBean cellTwoBean =
(OAMessageStyledTextBean)this.createWebBean(pageContext,
OAMessageStyledTextBean.MESSAGE_STYLED_TEXT_BEAN,
null,
"Cell2"
); cellTwoBean.setViewUsageName("XxxxVO1");//此列绑定的VO
cellTwoBean.setViewAttributeName("prodType2");//此列绑定的VO中的字段
cellTwoBean.setLabel("第2个动态单元格"); //此列需要显示的题头 //同上,CssCode为VO的一个字段
/*其VORowImpl中的写法类似于
public String getCssCode()
{
//return (String) getAttributeInternal(CSSCODE);
// return CSS
if( this.getScore() != null && this.getScore().floatValue() < 0 )
{
//OAF的CSS样式的设定请参考其他资料
return "TouchScreenRedDataText";
}else
{
return "";
} } */
OADataBoundValueViewObject cssjob = new OADataBoundValueViewObject(cellTwoBean,"CssCode");
cellTwoBean.setAttributeValue(oracle.cabo.ui.UIConstants.STYLE_CLASS_ATTR, cssjob); tableBean.addIndexedChild(cellTwoBean); for(int i=3; i<n+1; i++ ){
//动态创建WebBean
OAMessageStyledTextBean summary =
(OAMessageStyledTextBean)this.createWebBean(pageContext,
OAMessageStyledTextBean.MESSAGE_STYLED_TEXT_BEAN,
null,
"Text" + i
); String label = null;
label = "Prodtype" + i;
//从AccountCostDetailVO中显示对应到的数据项到动态的webBean
summary.setViewUsageName("AccountCostDetailVO");
summary.setViewAttributeName(label);
summary.setLabel("第"+i+"个动态单元格"); tableBean.addIndexedChild(summary);
}

为动态创建的组件添加FireAction事件

// 启用Expense Template的FireAction功能
OAMessageChoiceBean choiceBean = (OAMessageChoiceBean)webBean.findChildRecursive("ExpenseTemplate");
choiceBean.setFireActionForSubmit("change", null, null, true);
        OACellFormatBean createApproveCellBean =(OACellFormatBean)this.createWebBean(pageContext , OAWebBeanConstants.CELL_FORMAT_BEAN , null , null);

        OAButtonBean hierarchBean =
(OAButtonBean)createWebBean(pageContext , OAWebBeanConstants.BUTTON_BEAN , null , null);
hierarchBean.setID("CuxHierarySumbitBtn");
hierarchBean.setName("CuxHierarySumbitBtn");
String hierarchy = pageContext.getMessage("CUX" , "CUX_APPROVAL_HIERARCHY" , null);
hierarchBean.setLabel(hierarchy);
hierarchBean.setText(hierarchy);
hierarchBean.setFireActionForSubmit("CuxHieraryEvent" , null , null , true);
createApproveCellBean.addIndexedChild(hierarchBean); OARowLayoutBean btnRowBean =(OARowLayoutBean)webBean.findChildRecursive("ButtonBarRow");
btnRowBean.addIndexedChild(createApproveCellBean);

为table中的bean组件添加事件,并在事件处理中可以获取当前行的参数

import java.util.HashTable;

Hashtable params = new Hashtable();
params.put("param_AucHeaderId" , new OADataBoundValueViewObject(attrBidValueBean , "AuctionHeaderId"));
params.put("param_BidNumber" , new OADataBoundValueViewObject(attrBidValueBean , "BidNumber"));
params.put("param_LineNumber" , new OADataBoundValueViewObject(attrBidValueBean , "LineNumber"));
params.put("param_SequenceNumber" , new OADataBoundValueViewObject(attrBidValueBean , "SequenceNumber")); attrBidValueBean.setFireActionForSubmit("AttrBidValueNumEvent" , null , params , false , false);

或者创建事件后,在PFR中使用获取事件行的方式去获得当前行的列值

//注:动态创建的不能以EVENT_SOURCE_ROW_REFERENCE方法来获取当前行。

 String rowRef = pageContext.getParameter(EVENT_SOURCE_ROW_REFERENCE);
Row currentRow = am.findRowByRef(rowRef);
currentrow5.getAttribute("Sscore");

现在TABLE里面的每行都有一个poplist,用的相同的VO,但是要求每行的下拉框中的值根据当前行的某些值来获取。

OATableBean table = (OATableBean)webBean.findChildRecursive("TableRN");;
OAMessageChoiceBean statsfiedBean =
(OAMessageChoiceBean)webBean.findChildRecursive("InstallmentName"); if (statsfiedBean != null) {
statsfiedBean.setPickListCacheEnabled(false);
statsfiedBean.setListVOBoundContainerColumn(0, table,
"ProjectName" /* ProjectName 是TableRN中的组件ID,而不是TableRN对应的VO中的attribute*/
); }
//OAF JAVA DOC标准示例

OATableBean table = ...
OAMessageChoiceBean empPoplist =
(OAMessageChoiceBean)table.findChildRecursive("EmpName");
empPoplist.setListVOBoundContainerColumn(0, /* bind index */
table,"Deptno" /* Deptno是table中的组件ID,而不是table对应的VO中的attribute*/ );

参考资料:

EBS OAF开发中的绑定值(BoundValues)

EBS OAF开发DataBoundValues的使用示例-动态显示表列的左右对齐

            

OAF 动态创建组件以及动态绑定属性的更多相关文章

  1. Angular动态创建组件之Portals

    这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...

  2. 动态创建组件TEdit

    //动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftSt ...

  3. Delphi动态创建组件,并释放内存

    开发所用delphi版本是xe2,效果图如下: 代码如下: ---------------------------------------------------------------------- ...

  4. Vue动态创建组件方法

    组件写好之后有的时候需要动态创建组件.例如: 编辑文章页面,正文是一个富文本编辑器,富文本编辑器是一个第三方的组件,点击添加章节的时候需要动态的创建一个富文本编辑器这个时候怎么处理呢. 富文本编辑器也 ...

  5. angular4 动态创建组件 vs 动态创建模板

    实现  模拟场景:页面上"帮助"按钮的点击触发帮助文档的弹出框,且每个页面的帮助文档不一样 因此弹出框里的帮助文档是一个动态模板而不是动态组件 以下comp均代表Type类型的动态 ...

  6. Delphi 动态创建组件,单个创建、单个销毁

    效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 pro ...

  7. ExtJS动态创建组件

    J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...

  8. oaf 动态创建table vo (转)

    原文地址:如何动态创建table 需求: 因为系统中有几千个QA plan 但是不能手动创建几千个 质量收集页面所有需要根据 不同的plan 动态创建对应的 质量收集页面. 但是创建tabel 都要绑 ...

  9. vue 动态创建组件(运行时创建组件)

    function mountCmp (cmp, props, parent) { if (cmp.default) { cmp = cmp.default } cmp = Vue.extend(cmp ...

随机推荐

  1. Java MD5校验与RSA加密

    区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私钥进 ...

  2. PT100高精度测温电路 AD623+REF3030(转)

    源: PT100高精度测温电路 AD623+REF3030(很稳定)

  3. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)

    P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...

  4. P1661 扩散

    P1661 扩散 二分+最小生成树(kruskal使用并查集) 不清楚的题意导致我被坑了qwq,其实间接联通也是允许的.所以可以使用并查集+最小生成树维护 每次二分答案,然后跑一遍最小生成树判断是否联 ...

  5. JavaScript 实现表格隔行变色

    JavaScript 实现表格隔行变色 版权声明:未经授权,严禁分享! 构建界面 界面HTML代码 <style> #data,th,td{ border: 1px solid #aaaa ...

  6. 《网络攻防》实验八:Web基础

    适逢多事之际,下周二的课设答辩.全国信安竞赛初赛作品筹备.协会密码沙龙比肩接踵,这些"案牍"不仅劳形还影响了我的复习计划."甘蔗没有两头甜的"还是要有所舍得了, ...

  7. 解决Duilib集成CEF浏览器在Win10无法向客户区拖拽文件

    在Duilib中集成CEF浏览器项目实际开发中,遇到一个问题. 一个需求从资源管理器(桌面)拖拽文件到客户端,窗口捕获WM_DROPFILES消息然后进行消息处理,但客户区是集成的CEF浏览器,浏览器 ...

  8. sql 题目

    1.自增列 通用: ) from table b where b.sid<a.sid) ,* from table a; ,),* from ... 第二个已经有主键自增列的就不可以用了 还有就 ...

  9. POJ 1236 Network of Schools(tarjan)题解

    题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...

  10. nginx配置二级域名

    我在我的服务器上面跑了两个node应用程序,分别一个端口2368跑的是ghost博客,一个端口8000跑的是我的demo程序.想要一级域名zhangruojun.com用来访问博客,二级域名demo. ...