ADF How To Use Checkbox in RichTable



JDeveloper 11.1.1.2.0
Oracle 10g EE

在开发中经常遇到的一种情况是需要将Table中某列的两种状态,如Y/N在界面上表现为checkbox的形式。ADF中checkbox默认返回true/false,不符合数据表中存储数据的要求。故需要对true/false进行转换。这里有两种方式完成转换。



1. 在ViewController端页面的PageDef.xml文件中添加对应字段的绑定
类型为Button,选择对应的AM,VO,字段名称,如果该字段具有LOV,不需要选择对应LOV而保留None即可。在Selected State Value中填写勾选时需要的值,Unselected State Value中选择飞勾选状态时的值
后将界面控件通过el表达式关联至该绑定即可。通常将属性由Application Navigator中拖动入界面时会自动完成该绑定添加的过程。

2. 遵
循MVC的原则,修改VO对应字段的get/set方法,将ViewController返回的true/false转换为需要的字符。具体做法为在对应
VO属性中的Java页生成Java文件,只需勾选Generate View Row Class并勾选Include
accessors,后再修改生成的Java文件中对应字段的get/set方法即可。


况在RichTable等Collection Component中有所不同。不同于界面上其他控件的属性绑定方式,ADF
RichTable等Collection
Component通常绑定文件中为tree类型,而控件则使用el表达式访问该tree的collectionModel或treeModel
而Richtable中的列则通过row.bindings.XXX.inputValue的方式来访问该tree中的每一行值
而在页面的PageDef.xml文件中添加tree类型的绑定时,只可以选择绑定到的VO列名称,而没有属性可以设置将该列的值映射为checkbox的true/false。

ADF中使用将tree类型绑定中的树形绑定入另一button类型绑定,并在该button类型绑定中设置Selected/Unselected值的方式完成值的转换。具体内容如下:


1. 在PageDef.xml中添加tree类型并包含目标字段,添加button类型的绑定,映射至VO对应字段。

2. 设置button类型绑定的Selected/Unselected等属性
3. 点击编辑器左下角进入Source模式,找到tree类型绑定的代码,形如
<tree IterBinding="XXXXX" id="XXXXX">
<nodeDefinition DefName="XXXXX" Name="XXXXX">
<AttrNames>
<Item Value="XXXXX"/>
<Item Value="XXXXX"/>
<Item Value="XXXXX"/>
</AttrNames>
</nodeDefinition>
</tree>
修改需要使用Checkbox的字段,将其绑定至第一步创建的button类型绑定
<tree IterBinding="XXXXX" id="XXXXX">
<nodeDefinition DefName="XXXXX" Name="XXXXX">
<AttrNames>
<Item Value="XXXXX"/>
<Item Value="XXXXX"/>
<Item Value="EnabledFlag" Binds="EnabledFlag"/>
</AttrNames>
</nodeDefinition>
</tree>


此便完成了RichTable等CollectionComponent中checkbox的设置。需要注意的是通常这些设置在开发者将
Application
Navigator中的属性拖入界面RichTable中并选择展现为CheckBox时会自动完成,但在某些特定情况下,如该VO中目标属性具有LOV
时,由于IDE本身的BUG(?)导致上述Binds="XXX"及button类型的绑定没有自动生成,则需要手工修正绑定以达到所需效果。