介绍
在ADF的Table中,我们能实现在表格中添加,编辑,删除行的功能,以及一行数据中的级联。然而在多数时候,当一行的列太多,表格中的数据量不多的时候,这种在table中直接添加的方式则显得很不友好,因为要来回的拉动横向的滚动条。那么有什么办法能以表单的方式来添加一行,添加一条数据时添加一个表单,直到有多个表单出现在页面上,当然也包括删除,级联等(还没有实现数据量大时分页功能,因此此功能现在只使用少量数据添加)。本文将介绍如何实现本功能。
效果预览
准备
本实例将以Oracle数据库自带的事例Schema HR作为数据源。另外克隆一个EMPLOYEES的表EMPLOYEES_BAK作为要添加删除的对象,表中的数据量不要太大,可以删除一些。 而上图中的Manager栏位仍然以原有的EMPLOYEES表作为下拉列表的数据源,以便做级联时用。
关键步骤
1.按照ADF标准的做法,在Datacontrol中将Employees的VO拖到页面上,生成一个可编辑的table(此举只为方便后面的步骤,做完后面的步骤,请删除本操作生成的table)。
2.使用af:iterator迭代table中value属性的值,如:#{bindings.Employees1.collectionModel}
- <af:iterator id="i1" value="#{bindings.Employees1.collectionModel}"
- var="row" varStatus="vs">
- <!--.......省略........-->
- </af:iterator>
3.在af:iterator标签中,可以任意的去排版这个Form,Form中的元素可以从第一步中生成的table中去拖取,内容不用做修改。
4.设置级联组件的PartialTriggers
5.为此功能添加插入、删除、提交、回滚功能。做法和在table中完全一致
6.当表中没有数据时,我们希望在进入页面的时候自动创建一个新行,可以在Taskflow中使用Router判断是否需要创建行
- <?xml version="1.0" encoding="UTF-8" ?>
- <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">
- <task-flow-definition id="employee-task-flow">
- <default-activity id="__1">router1</default-activity>
- <managed-bean id="__3">
- <managed-bean-name id="__2">EmployeeBean</managed-bean-name>
- <managed-bean-class id="__5">view.backing.EmployeeBean</managed-bean-class>
- <managed-bean-scope id="__4">view</managed-bean-scope>
- </managed-bean>
- <view id="employeeForm">
- <page>/fragment/employeeForm.jsff</page>
- </view>
- <router id="router1">
- <case>
- <expression>#{data.view_employeeFormPageDef.Employees1Iterator.estimatedRowCount
- == 0}</expression>
- <outcome id="__6">create</outcome>
- </case>
- <default-outcome>next</default-outcome>
- </router>
- <method-call id="CreateEmployee">
- <method>#{data.view_employeeFormPageDef.CreateInsert.execute}</method>
- <outcome id="__12">
- <fixed-outcome>next</fixed-outcome>
- </outcome>
- </method-call>
- <control-flow-rule id="__7">
- <from-activity-id id="__8">CreateEmployee</from-activity-id>
- <control-flow-case id="__10">
- <from-outcome id="__11">next</from-outcome>
- <to-activity-id id="__9">employeeForm</to-activity-id>
- </control-flow-case>
- </control-flow-rule>
- <control-flow-rule id="__13">
- <from-activity-id id="__14">router1</from-activity-id>
- <control-flow-case id="__15">
- <from-outcome id="__17">create</from-outcome>
- <to-activity-id id="__16">CreateEmployee</to-activity-id>
- </control-flow-case>
- <control-flow-case id="__19">
- <from-outcome id="__20">next</from-outcome>
- <to-activity-id id="__18">employeeForm</to-activity-id>
- </control-flow-case>
- </control-flow-rule>
- <use-page-fragments/>
- </task-flow-definition>
- </adfc-config>
总结
其实本文主要还是用实例来说明iterator组件的使用,关于iterator组件和foreach组件的区别可以参见我早些时候写的博客http://blog.csdn.net/ygj26/article/details/8013133
代码下载
http://download.csdn.net/detail/ygj26/4642116
转自:http://blog.csdn.net/ygj26/article/details/8067023