2

我有一个使用 Primefaces 3.5 的数据表,如下所示

在此处输入图像描述

现在我正在编辑 id 为 43 的第二行,如下所示。

在此处输入图像描述

当我单击对勾(最右边的列)时,该行被编辑,如下所示。

在此处输入图像描述

可以很容易地注意到,州的名称从更改为xxxxzzz但国家似乎保持不变,预计将更新为AmericaGermany

rowEdit实际上,已经对数据库进行了更改,但在事件完成时它们似乎并没有反映到 dataTable 中。

要观察对国家/地区所做的更改,需要重新加载页面。只有在重新加载此页面时,它才会显示正确的数据,如下所示

在此处输入图像描述


这是列出国家/地区下拉框的列。

<p:ajax event="rowEdit" listener="#{stateManagedBean.onRowEdit}" update=":form:dataTable :form:systemMessages :form:messages" process=":form:dataTable :form:systemMessages :form:messages"/>
<p:ajax event="rowEditCancel" listener="#{stateManagedBean.onRowEditCancel}" update=":form:systemMessages :form:messages" process=":form:systemMessages :form:messages"/>


<p:column headerText="Country" sortBy="#{state.country.countryName}" filterBy="#{state.country.countryName}" filterMaxLength="45">                    
    <p:cellEditor>
        <f:facet name="output">
            <h:outputText value="#{state.country.countryName}" />
        </f:facet>
        <f:facet name="input">
            <p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" rendered="true" editable="false" converter="#{longConverter}" converterMessage="The supplied value is incorrect." required="true" requiredMessage="Select an appropriate option." style="width:100%;">
                <f:selectItems var="country" value="#{stateManagedBean.countries}"  itemLabel="${country.countryName}" itemValue="${country.countryId}" itemLabelEscaped="true" rendered="true"/>
            </p:selectOneMenu>
        </f:facet>
    </p:cellEditor>
</p:column>

以下onRowEdit()是单击勾选时触发的方法(在 JSF 托管 bean 中)。

public void onRowEdit(RowEditEvent event)
{
    StateTable stateTable=(StateTable) event.getObject();

    if(stateService.update(stateTable))
    {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Success : ",  "The row with the id "+stateTable.getStateId()+" has been updated successfully.");
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
}

JSF 托管 beanJSF 页面的完整代码。


rowEdit()方法中(如上),stateTable.getCountry().getCountryId()显示更新countryId但使用这个国家对象来引用相应的国家名称,就像stateTable.getCountry().getCountryName()只显示旧的国家名称(不是更新的国家名称)。解决这个问题的方法是什么?


重要的:

在上面的 XHTML 代码片段中,两者的 value 属性,

<h:outputText value="#{state.country.countryName}"/>
                       ^^^^^^^^^^^^^_^^^^^^^^^^^
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../>
                                              ^^^^^^^^^^^^^_^^^^^^^^^

是不同的,这对于显示国家名称而不是显示国家 ID 并引用相应的国家 ID 至关重要。

如果更改它们以反映相同的value属性,

<h:outputText value="#{state.country.countryId}"/>
                       ^^^^^^^^^^^^^_^^^^^^^^^
<p:selectOneMenu id="cmbCountryMenu" value="#{state.country.countryId}" .../>
                                              ^^^^^^^^^^^^^_^^^^^^^^^

然后它按预期工作(Primefaces 展示示例就像这样演示)。


这与更新页脚值动态显示一列的数值总数相同。更新该列中的行时不会更新页脚。该问题已在此处报告。

4

1 回答 1

5

问题是你没有改变整个国家的对象。因为您使用#{state.country.countryId}的只是当前所选国家/地区p:selectOneMenu的属性的值正在更改,而不是国家/地区,即其他属性将保持不变。countryIdcountryName

您必须更改p:selectOneMenuto#{state.country}和toitemValue的值。看看陈列柜。_f:selectItems#{country}p:selectOneMenu

此外,由于country默认情况下没有可用转换器的 POJO,您必须实现 acountryConverter并在通过 选择项目时将其用于转换p:selectOneMenu

使用以下代码p:selectOneMenu本文作为实现转换器的支持。

<p:selectOneMenu id="cmbCountryMenu" value="#{state.country}" rendered="true" editable="false" converter="#{countryConverter}" converterMessage="The supplied value is incorrect." required="true" requiredMessage="Select an appropriate option." style="width:100%;">
    <f:selectItems var="country" value="#{stateManagedBean.countries}"  itemLabel="#{country.countryName}" itemValue="#{country}" itemLabelEscaped="true" rendered="true"/>
</p:selectOneMenu>
于 2013-06-03T13:04:24.000 回答