介绍
在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