我有一个最初填充没有数据的数据表(空列表)。表的页脚中有一个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 "";
}
任何建议都表示赞赏。
答案 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();
}