6

いくつかの行を持つデータテーブルがあり、その行のオブジェクトを削除する単純なボタンを持つフォームがある列があります。

最初に作業バージョン:

<h:dataTable value="#{actorTableBackingBean.allActors}" 
    var="actor" styleClass="table table-bordered">

    <h:column headerText="Actor Name" sortBy="#{actor.firstName}">
        <h:outputText value="#{actor.firstName}"/>
    </h:column>

    <h:column headerText="Actor Detail">
        <h:form>
            <h:commandButton value="Delete Actor" 
                styleClass="btn btn-primary" 
                action="#{actorTableBackingBean.deleteActor(actor.actorId)}"/>
         </h:form>
    </h:column>
</h:dataTable>

deleteActorメソッドは次のようになります

public String deleteActor(String id){
    removeActorWithId(id);
    return "/allActors.xhtml";
}

private void removeActorWithId(String id){
    int idk = Integer.parseInt(id);
    for(Actor a:allActors){
        if(a.getActorId() == idk){
            allActors.remove(a);
            return;
        }
    }
}

したがって、これはまさに期待どおりに機能します。

ただし、ここに示すように Primefaces のページネーション データ テーブルを使用すると、削除ボタンは 2 番目のケースの FIRST ROW に対してのみ機能し、最初にのみ機能します。他の行の「削除」ボタンをクリックしても、何も起こりません。その理由は何ですか?

2番目の状況では、リンクに見られるように < form > タグを p:dataTable の周りに置き、h:dataTable のようなすべてを p:dataTable や p:column などに置き換えます...

4

2 に答える 2

16

フォームタグにデータテーブルを含めることをお勧めします。これは機能します:

<h:form id="actorsTableForm">
            <p:dataTable id="actorsTable" var="item"
                value="#{actorsMB.actorList}" selectionMode="single"
                rowKey="#{item.description}" paginator="true" rows="10"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15" paginatorPosition="bottom">
                <p:column headerText="Actor Id" >
                    <h:outputText value="#{item.id}" />
                </p:column>
                <p:column headerText="Actor Description">
                    <h:outputText value="#{item.description}" />
                </p:column>
                <p:column>
                    <p:commandButton icon="ui-icon-trash"
                        title="Delete this actor"
                        actionListener="#{actorsMB.remove(item)}"
                        ajax="false" />
                </p:column>
            </p:dataTable>
</h:form>

マネージド Bean のメソッド:

public void remove(Actor actor) {
    try {
        actorService.remove(actor);
        actorList = actorService.searchAll();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

それが役に立てば幸い。

于 2013-07-05T21:02:23.217 に答える