OAF 动态创建组件以及动态绑定属性
在开发中,我们遇到以下一个需求。
一个表格左侧有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开发DataBoundValues的使用示例-动态显示表列的左右对齐
OAF 动态创建组件以及动态绑定属性的更多相关文章
- Angular动态创建组件之Portals
这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...
- 动态创建组件TEdit
//动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftSt ...
- Delphi动态创建组件,并释放内存
开发所用delphi版本是xe2,效果图如下: 代码如下: ---------------------------------------------------------------------- ...
- Vue动态创建组件方法
组件写好之后有的时候需要动态创建组件.例如: 编辑文章页面,正文是一个富文本编辑器,富文本编辑器是一个第三方的组件,点击添加章节的时候需要动态的创建一个富文本编辑器这个时候怎么处理呢. 富文本编辑器也 ...
- angular4 动态创建组件 vs 动态创建模板
实现 模拟场景:页面上"帮助"按钮的点击触发帮助文档的弹出框,且每个页面的帮助文档不一样 因此弹出框里的帮助文档是一个动态模板而不是动态组件 以下comp均代表Type类型的动态 ...
- Delphi 动态创建组件,单个创建、单个销毁
效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 pro ...
- ExtJS动态创建组件
J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...
- oaf 动态创建table vo (转)
原文地址:如何动态创建table 需求: 因为系统中有几千个QA plan 但是不能手动创建几千个 质量收集页面所有需要根据 不同的plan 动态创建对应的 质量收集页面. 但是创建tabel 都要绑 ...
- vue 动态创建组件(运行时创建组件)
function mountCmp (cmp, props, parent) { if (cmp.default) { cmp = cmp.default } cmp = Vue.extend(cmp ...
随机推荐
- Notes of Head.First.HTML.and.CSS.2nd.Edition
What does the web server do? tirelessly waiting for requests from webbrowsers What does the web brow ...
- P3627 [APIO2009]抢掠计划
P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...
- 简单的Django实现图片上传,并存储进MySQL数据库 案例——小白
目标:通过网页上传一张图片到Django后台,后台接收并存储进数据库 真是不容易!!这个案例的代码网上太乱,不适合我,自己摸索着写,终于成功了,记录一下,仅供自己参考,有的解释可能不对,自己明白就好, ...
- 20145127《java程序设计》第二次实验
一.实验内容及其步骤 1.要想对某个程序进行单元测试,我们先是在eclipse中建立了一个新的项目,项目的名字是TDDDmeo.并在这个新的项目里右键单击创建一个source floder.并将flo ...
- 20145301 赵嘉鑫 《网络对抗》Exp5 MSF基础应用
20145301 赵嘉鑫 <网络对抗>Exp5 MSF基础应用 一 实验链接 渗透实验一:MS08_067渗透实验 渗透实验二:MS14_064渗透实验 (首用) 渗透实验三:Adobe ...
- Spark On YARN 分布式集群安装
一.导读 最近开始学习大数据分析,说到大数据分析,就必须提到Hadoop与Spark.要研究大数据分析,就必须安装这两个软件,特此记录一下安装过程.Hadoop使用V2版本,Hadoop有单机.伪分布 ...
- linux的dns被劫持
环境:ubuntu16.04 解说:ubuntu使用dnsmasq获取要解析的网站ip,dnsmasq通过域名服务器获取网站ip,并将ip缓存起来,那么就可以减少对外网域名服务器的访问,从而可以使系统 ...
- Dubbo学习参考
参考博客: 小宝鸽:https://blog.csdn.net/u013142781/article/details/50387583 https://blog.csdn.net/u013142781 ...
- excel的C#操作教程
C# Excel Tutorial http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm How to transfer ...
- Stream API
引例: 1 List<String> strList = Arrays.asList("zhaojigang","nana","tiany ...