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 分页数据表时,删除按钮仅适用于第二种情况下的第一行,并且仅适用于第一次。当我单击其他行的“删除”按钮时,什么也没有发生。可能是什么原因?

对于第二种情况,只需将 < 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 回答
1

以下代码可能会对您有所帮助。

你的 xhtml 代码应该是这样的

    <h:form>
         <h:dataTable value="#{actorTableBackingBean.allActors}" 
            binding="#{actorTableBackingBean.dataTable}"
            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:commandButton value="Delete Actor" 
                        styleClass="btn btn-primary" 
                        action="#{actorTableBackingBean.deleteActor}"/>

                </h:column>
        </h:dataTable>
   </h:form>

您必须在 bean 文件中添加一个 DataTable 变量

private javax.faces.component.html.HtmlDataTable dataTable;

public HtmlDataTable getDataTable() {
    return dataTable;
}

public void setDataTable(HtmlDataTable dataTable) {
    this.dataTable = dataTable;
}

你的delete方法应该是这样的

public String deleteActor(){
    Actor model = (Actor) dataTable.getRowData();
    removeActorWithId(model);
    return "/allActors.xhtml";
}

private void removeActorWithId(Actor model){
    if(model!=null){
        allActors.remove(model);
    }
}
于 2013-07-06T07:50:33.567 回答