ADF中的基于LOV的级联下拉菜单补充:
我们都知道ADF的List Of Values. 虽然很好用,但是对于刚刚接触ADF的人来说,也不是那么好理解的.
前几日在开发中遇到一个需要改造三级级联下拉列表,起初我以为只用改类似下面的RegionCountryVO中的查询语句,从而当不同参数传入的时候,会使得其中的第三个下拉列表出现不同的选项,(你传入的参数只会对第三个下拉列表的选项有影响), 后来我发现,改过sql语句之后,还是没有变化,后来我才发现,为什么每个下拉列表里能出来哪些选项,实际上跟LOV的list data source有关系,而对LOV的值进行过滤主要依靠当前VO的属性来控制. 所以需要改动的查询其实应该是list data source关联的VO.
级联菜单之selectOneChoice:
级联菜单是指:两个或者多个下拉菜单或者选项组,由于父选项的变动而引起的与之相关的子选项可选项的变动.
我们使用oracle xe数据库的schema(HR)的Regions和Countries, 一个Region对应多个Country,当我们选择其中一个Region的时候,Country给我们的可选项会随着Region的值的变化而变化;
在ADF中,想要做到级联的效果其实并不难.
首先分析: 这里我们使用下拉菜单.
通常我们在做下拉菜单的时候,我们都会在下拉菜单里对应上”一组”---(key,value)值, value作为下拉菜单的显示, 而key是做我们后台处理的值使用.当我们选择其中value所显示的选项,我们通常会拿到key来进行我们必要的操作.比如查询.
如果是级联, 子选项的值是取决于父选项的取值.那么子选项一定是将父选项的key作为了参数, 放在子选项的查询条件里. 在每次父选项的值发生变化的时候, 就改变子选项的可选值.
创建级联的说明性步骤:
1, 创建我们下拉菜单的数据源VO.(即普通的vo),并且在作为子选项的数据来源的VO中加入查询条件.使用sql中的变量或者view Criteria均可.
2. 创建将两组选项关联的VO(属性可更新). 我们称之为级联VO 后面会说明
我们使用sql来查询.
selectregions.region_id, regions.region_name, countries.country_id,countries.country_name from regions,countries whereregions.region_id = countries.country_id
将所有的属性设置为可更新. Updatable = always
3. 在级联VO中, 我们加入父子选项的数据来源.这个时候就会用到我们先前创建的普通VO.
a) 在overview中,点击viewaccessors,然后添加我们需要的VO,ok
b) 在列表中找到子选项的数据来源的VO, 比如:countriesVO,编辑. 你会看到你先前创建的数据来源VO的查询条件.如果是view Criteria,就启用你所需要的, 或者如果你使用的sql变量的话,你可以直接看到参数列表.
c) *将你在级联VO中对应的Attribute的name填写到对应的参数Value一栏.(参数的value一定要级联VO中的attributename对应.).原因会有说明.
d) 在作为父子选项的key值上添加LOV
4. 在页面上, 在DataControl面板里把级联VO中的父子选项分别拖拽到页面中,并使用Select One Choice组件.在父选项的组件中加入autoSubmit=”true”, 在子选项的组件中加入autoSubmit=”true”, partialTriggers="父选项组件id".
5. 右键页面, run.
注释:
1. 之所以需要把级联VO设置为属性可以更新是指,VO的属性对于module来说是可以更新的,只有这样,当级联VO中的父选项属性改变的时候,子选项属性改变,才能达到级联的效果,否则在页面上看到的将会是两个选项数据来源的第一行数据(作为text显示,而不再是可变更的下拉列表。)
2. 当级联VO中的父选项改变的时候,也就是父选项的id改变,会更新到module中,然后传递给子选项的查询参数,从而查询出子选项需要的数据.
以上内容均为本人个人意见!如果错误还请指正,本人不胜感激!