您的位置:首页 > 其它

实现Table数据自动填充功能之一:修改

2015-08-07 17:01 176 查看
开发运行环境:JDeveloper 11.1.2.4 + Oracle Database XE11gR2

前一个实验使用的是Form,实际情况中,还可能会使用Table。

考虑以下场景:用户修改一行记录时,修改其中某个字段后,希望能够带出其它字段值,即自动填充。

1. 为了不影响其它VO,新建一个VO:EmployeesDetailsView。

注意,为了演示自动填充的功能,这里手工添加了一个Transient Attribute:JobTitle。

也就是说,这个JobTitle并不是从Jobs EO中关联过来的。

我是为了演示输入JobId,自动把JobTitle带出来。


2. 修改JobsView,增加一个View Criteria:GetJobTitleByJobIdViewCriteria,用于根据JobId获取JobTitle。

3. 修改JobsViewImpl.java,增加一个方法:,用于根据JobId获取JobTitle,并将其暴露到Client。

public void getJobTitleByJobId(String jobId) {

this.setApplyViewCriteriaNames(null);

ViewCriteria criteria =this.getViewCriteria("GetJobTitleByJobIdViewCriteria");

this.setRangeSize(10);

this.applyViewCriteria(criteria);

this.setbv_job_id(jobId);

this.executeQuery();

}
4. 修改页面,在JobId上增加ValueChangeListener
完成后的页面代码如下:
<af:inputTextvalue="#{row.bindings.JobId.inputValue}"
label="#{bindings.EmployeesDetailsView1.hints.JobId.label}"
required="#{bindings.EmployeesDetailsView1.hints.JobId.mandatory}"
columns="#{bindings.EmployeesDetailsView1.hints.JobId.displayWidth}"
maximumLength="#{bindings.EmployeesDetailsView1.hints.JobId.precision}"
shortDesc="#{bindings.EmployeesDetailsView1.hints.JobId.tooltip}"
autoSubmit="true" id="it6"
valueChangeListener="#{viewScope.myBackingBean.onJobIdValueChange}">
<af:autoSuggestBehavior maxSuggestedItems="10"
suggestItems="#{viewScope.myBackingBean.onJobIdSuggest}"/>
<f:validator binding="#{row.bindings.JobId.validator}"/>
</af:inputText>

对应的Managed Bean中的方法代码如下:

publicvoid onJobIdValueChange(ValueChangeEvent valueChangeEvent) {
String newValue = (String)valueChangeEvent.getNewValue();
System.out.println("################################# 1 " +newValue);
OperationBinding binding =ADFUtils.findOperation("getJobTitleByJobId");
binding.getParamsMap().put("jobId", newValue);
binding.execute();

DCIteratorBinding it =ADFUtils.findIterator("JobsView1Iterator");
Row[] allRowsInRange = it.getAllRowsInRange();
if (allRowsInRange.length > 0) {
Row row = allRowsInRange[0];
String jobTitle = (String)row.getAttribute("JobTitle");
System.out.println("#################################2 " + jobTitle);
ADFUtils.setBoundAttributeValue("JobTitle",jobTitle);
}
}

这里有一个问题要注意:就是何时会触发InputText上的ValueChange事件。
答案是:当输入内容和以前的内容不一样时,并且焦点离开当前InputText时。
所以,自动提示功能发生在前,用户选择和以前不同的某个选项后,才会发生ValueChange事件。
因此,不要担心ValueChange事件会调用多次,其实只有一次。

5. 修改页面的Bindings,这一点和前一个实验一样。
不同的地方是,还要多增加一个Attribute Binding:JobTitle和一个methodAction Binding:getJobTitleByJobId。


6. 运行
修改某行记录,选择某个JobId:


选定后,JobTitle会自动带出来:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: