Spring Primefaces中的复选框p:dataTable在行上混合已删除
SpringWebflow2.4.1、Spring1.1、JSF2.2.3和Primefaces 5.1 我有一个dataTable,每行有两个布尔复选框,用于修改字段。用户可以修改条目或删除整行Spring Primefaces中的复选框p:dataTable在行上混合已删除,spring,jsf,primefaces,Spring,Jsf,Primefaces,SpringWebflow2.4.1、Spring1.1、JSF2.2.3和Primefaces 5.1 我有一个dataTable,每行有两个布尔复选框,用于修改字段。用户可以修改条目或删除整行 <h:form id="editForm"> <p:dataTable id="permissionTable" var="sdp" rowIndexVar="rowIndex" value="${serverDirectoryPermissions}">
<h:form id="editForm">
<p:dataTable id="permissionTable" var="sdp" rowIndexVar="rowIndex" value="${serverDirectoryPermissions}">
<p:column>
<f:facet name="header">
<h:outputText value="name" />
</f:facet>
<div>
<h:outputText value="${sdp.name}"/>
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="upload permission" />
</f:facet>
<div>
<p:selectBooleanCheckbox id="canUploadCheck" value="${sdp.hasUploadPermission}" />
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="delete permission" />
</f:facet>
<div>
<p:selectBooleanCheckbox id="canDeleteCheck" value="${sdp.hasDeletePermission}" />
</div>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value=" " />
</f:facet>
<div>
<p:commandButton id="removePermission" value="${tmsg.messages.sys_button_remove}" action="${documentManager.removeServerDirectoryPermission(serverDirectoryPermissions,sdp)}" ajax="true" process=":editForm" update=":editForm" immediate="true"/>
</div>
</p:column>
</p:dataTable>
</h:form>
单击remove按钮会触发一个操作,从原始列表中删除所选条目,然后ajax调用刷新表单(以及表)
public void removeServerDirectoryPermission(列出SDP,ServerDirectoryPermission sdpToRemove){
sdps.remove(sdpToRemove);
}
当表格刷新时,将删除正确的行。问题是,删除行下方的所有复选框都采用其正上方的行的值
e、 g
第1行正确-错误
第2行假-真
第3行正确
第4行假假
删除第2行后:
第1行正确-错误
第3行假-真
第4行正确
我调试了后端,并且第3行和第4行的bean中的值还没有更新,所以只有GUI显示了错误的值。Offc ourse如果我保存,则新值将被保存
我删除条目和更新数据表的方式是否出错
对于completenes,serverDirectoryPermissions是flowScope变量中的一个列表,当按下“保存”按钮时,它将持久保存在数据库中。保存过程工作正常,因此我省略了代码
非常感谢
>>编辑为什么要依赖行索引来删除行?选择其他方式删除条目。在Facelets中使用
#
(而不是$
)。此条件检查,if(sdp.getId()==sdpToRemove.getId()){…}
将需要使用equals()
比较对象,除非两者或其中一个都具有基元类型。您好,我没有使用行索引。我使用迭代器循环列表,并找到要从列表中删除的元素的索引。该方法删除了正确的元素,表反映了这一点。只有复选框输入保持错误的值。我用equals()替换了支票,用#替换了美元,但是运气不好。谢谢anyway@malavock将u重写ServerDirectoryPermission.java的equals和hashCode。如果是,则在removeServerDirectoryPermission方法调用serverDirectoryPermissions.RemoveServerPermissions(sdp)中,将#{documentManager.removeServerDirectoryPermission(sdp)}更改为#${documentManager.removeServerDirectoryPermission(sdp)}。假设serverDirectoryPermissions已命名,并且您已将其注入DocumentManager.java中,我是否正确?我以前没有重写equals,我现在就重写了,并更新了代码,但没有成功。我知道列表中正确的条目被删除了,因为每行显示的“名称”都是正确的。我注意到现在规格部分被切断了。我使用的是SpringWebFlow,因此serverDirectoryPermissions是一个flowScope变量,而不是直接注入到文档管理器中。我有一些更新,我要编辑这篇文章。
public void removeServerDirectoryPermission(List<ServerDirectoryPermission> sdps, ServerDirectoryPermission sdpToRemove) {
sdps.remove(sdpToRemove);
}