2

以下に示すように、Primefaces 3.5 を使用した dataTable があります。

ここに画像の説明を入力

次の画像に示すように、ID 43 の 2 行目を編集しています。

ここに画像の説明を入力

目盛り (一番右の列) をクリックすると、次の図に示すように行が編集されます

ここに画像の説明を入力

xxxx州の名前が からに変更されていることは容易にわかりますが、国はからzzzに更新されることが予想されるままであるように見えます。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 マネージド BeanおよびJSF ページの完全なコード。


この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:selectOneMenucountryIdcountryName

p:selectOneMenuto#{state.country}itemValueofの値をf:selectItemstoに変更する必要があります#{country}のショーケースを見てくださいp:selectOneMenu

さらに、countryデフォルトでコンバーターが使用できない POJO と同様countryConverterに、 を介して項目を選択するときに、 を実装して変換に使用する必要があります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 に答える