commandButton action ="#{bean.delete(row)}"在datatable中似乎传递错误的行

时间:2014-09-04 19:38:52

标签: jsf primefaces datatable

我有一个最初填充没有数据的数据表(空列表)。表的页脚中有一个commandButton,可以向表中添加行。添加行时,行中的最后一个单元格是另一个commandButton以删除该行。我的问题是删除按钮不断删除表中的第一行,无论选择哪一行。

示例:如果我向表中添加3行并点击第二行的最后一个单元格中的删除按钮,action="#{addAccountBean.deleteFixVendor(dataItem)}"将第一行传递给deleteFixVendor方法而不是第二行被点击了。我无法弄清楚为什么第一行的对象继续传递给delete方法,无论单击哪个行按钮。

我的JSF代码:

<h:form>
<f:validateBean disabled="#{!empty param['disableValidation']}" >
<p:panel id="panel" header="Add New Account"  > 
    <p:dataTable var="dataItem" value="#{addAccountBean.account.vendors}" >

        <p:column headerText="Vendor"  >                                
            <p:selectOneMenu value="#{dataItem.vendor}">                
                        <f:selectItems value="#{addAccountBean.menu.fixOption}" />
                    </p:selectOneMenu>
            </p:column>

            <p:column headerText="Monthly Cost"  >
                <p:inputText value="#{dataItem.cost}" />    
            </p:column>

            <p:column headerText="Cost Date"  >
                <p:calendar value="#{dataItem.CDate}" pattern="MM/dd/yyyy" navigator="true" /> 
            </p:column>

            <p:column headerText="Delete" >
            <h:commandButton value="Delete" action="#{addAccountBean.deleteFixVendor(dataItem)}" >
                <f:param name="disableValidation" value="true" />
            </h:commandButton>  
        </p:column> 

        <f:facet name="footer" >
            <h:commandButton value="Add New Vendor" action="#{addAccountBean.addFixVendor}" >
                <f:param name="disableValidation" value="true" />
            </h:commandButton>      
        </f:facet>

    </p:dataTable>          
</p:panel>  
</f:validateBean>
</h:form>

Bean代码:

@ManagedBean
@SessionScoped
public class AddAccountBean implements Serializable {

private AccountData account = new AccountData();

public String addFixVendor() {

    account.getVendors().add(new VendorData());                 
    return "";
}

public String deleteFixVendor(VendorData vData) {

    account.getVendors().remove(vData);                         
    return "";                                                          
}

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

到目前为止发布的代码看起来很好。对此问题唯一可行的解​​释是equals()类中的VendorData方法损坏。 Collection#remove()将删除集合中第一个equals()给定对象的项目。

如果您的(基本)实体具有id属性,则应执行以下操作:

@Override
public boolean equals(Object other) {
    return (other != null && getClass() == other.getClass() && id != null)
        ? id.equals(((VendorData) other).id)
        : (other == this);
}

@Override
public int hashCode() {
    return (id != null) 
        ? (getClass().hashCode() + id.hashCode())
        : super.hashCode();
}