我正在使用Primefaces的p:dataTable来显示可编辑表格,同时我正在使用p:rowEditor来添加或删除行。当我添加一行时,我会向数据列表中添加一个对象并更新datatable,这很好用。但是当我取消编辑时,我将从datatable中删除已添加的对象,监听器被触发,但它不会更新datatable,请问有什么建议吗。 以下是.xhtml文件:
<h:form id="Users">
<p:dataTable id="datalist"
value="#{beanController.listusr}" var="item"
selectionMode="single" editable="true"
styleClass="datalistdisplayusr"
selection="#{beanController.selectedusr}"
rowKey="#{item.usrId}"
paginator="true" rows="5" rowsPerPageTemplate="5,10,15">
<f:facet name="header">
<p:commandButton id="newusrButton" icon="ui-icon-plus"
value="Create"
actionListener="#{beanController.createusr}"
update=":Users:datalist"
oncomplete="$('.datalistdisplayusr .ui-datatable-data .ui-row-editor .ui-icon-pencil').first().click();"
/>
</f:facet>
<p:ajax event="rowEdit"
listener="#{beanController.saveusr}"
update=":Users:datalist" />
<p:ajax event="rowEditCancel"
listener="#{beanController.onCancel}"
update=":Users:datalist" />
<p:column style="width:6%">
<p:rowEditor />
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.usrId}" />
</f:facet>
<f:facet name="input">
<p:inputText id="Id" value="#{item.usrId}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="First Name" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.usrName}" />
</f:facet>
<f:facet name="input">
<p:inputText id="FirstName" value="#{item.usrName}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column >
<f:facet name="header">
<h:outputText value="Last Name" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.usrSurName}" />
</f:facet>
<f:facet name="input">
<p:inputText id="SurName" value="#{item.usrSurName}" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
以下是“保存”方法。直到现在,一切都很顺利,我已经添加了对象并更新了数据表:
public void createusr(ActionEvent event) {
UserDTO usr = new UserDTO();
listusr.add(0, usr);
}
这里是 onCancel 监听器:
public void onCancel(RowEditEvent event){
list.remove(0);
}
监听器被触发,对象被删除,但如果datatable未更新,则不会删除该行,而是会复制第二行。
listusr.remove(0)
而不是list.remove(0)
吗? - Mr.J4mes