我使用带有复选框选择功能的数据表,但是当我在选择一些行后单击页脚按钮时,这些行不会受到我的对象selectedCommandes []的影响,并证明我在方法中添加了一行这显示了选定的Commandes []的长度,但它返回0,我不知道为什么, 我认为我的所有代码都很好 这是数据表:
<p:dataTable id="cars" var="car" value="#{commandesUserController.mediumCommandesModel}" selection="#{commandesUserController.selectedCommandes}" tableStyle="width:auto">
<f:facet name="header">
Checkbox Based Selection
</f:facet>
<p:column selectionMode="multiple" style="width:18px" />
<p:column headerText="Model" style="width:100px">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year" style="width:100px">
<h:outputText value="#{car.dateEnvoi}" />
</p:column>
<p:column headerText="Manufacturer" style="width:100px">
<h:outputText value="#{car.dateLivraisonRecommande}" />
</p:column>
<p:column>
<p:commandLink ajax="false" value="Editer" action="updateUser_v1" >
<f:setPropertyActionListener value="#{car}" target="#{editUserController.u1}" />
</p:commandLink>
</p:column>
<p:column>
<p:commandLink value="Supprimer" oncomplete="confirmation.show()" >
<f:setPropertyActionListener value="#{car}" target="#{commandesUserController.selectedCommande}" />
</p:commandLink>
</p:column>
<p:column style="width:40px">
<p:commandButton id="selectButton" update=":myform:carDlg" oncomplete="carDialog.show()" icon="ui-icon-search" title="View">
<f:setPropertyActionListener value="#{car}" target="#{commandesUserController.selectedCommande}" />
</p:commandButton>
</p:column>
<f:facet name="footer">
<p:commandButton id="supprion" value="supprimer selection" oncomplete="confirmation2.show()" />
</f:facet>
</p:dataTable>
以下是出现问题的按钮:
<f:facet name="footer">
<p:commandButton id="supprion" value="supprimer selection" oncomplete="confirmation2.show()" />
</f:facet>
这是我点击上面按钮时出现的对话框:
<p:confirmDialog id="confirmDialog2" message="etes vous sur de vouloir supprimer ces commande avec tous les données et fichiers correspondants !"
header="confirmation de suppression" severity="alert" widgetVar="confirmation2">
<p:commandButton id="confirm2" value="oui" update="cars" oncomplete="confirmation2.hide()"
action="#{commandesUserController.deleteCommandes()}" />
<p:commandButton id="decline2" value="non" onclick="confirmation2.hide()" type="button" />
</p:confirmDialog>
,这是managedBean中的方法:
public String deleteCommandes(){
System.out.println("je suis dans delete l ensemble avec tous = "+selectedCommandes.length);
for(int j = 0;j<selectedCommandes.length;j++){
selectedCommandes[j].setListFichiers(uh.getFichiersById(this.selectedCommandes[j].getId()));
for(int i = 0; i<selectedCommandes[j].getListFichiers().size();i++){
//System.out.println("alors "+selectedCommande.getListFichiers().get(i).getId());
uh.deleteFichier(selectedCommandes[j].getListFichiers().get(i));
}
uh.deleteCommande(selectedCommandes[j]);
}
return "commandesUser";
}
这一行:System.out.println(“je suis dans delete l ensemble avec tous =”+ selectedCommandes.length);总是返回0
我已经创建了实现SelectableDataModel
的类我希望我解释了这个问题
你知道吗? 谢谢答案 0 :(得分:0)
h:form
周围是否放置p:dataTable
?如果不是这种情况,这可能是导致问题的原因。
在PrimeFaces的展示页面上,结构如下所示:
<h:form>
<p:dataTable>
<!-- content of data table -->
</p:dataTable>
<p:confirmDialog>
<!-- content of dialog -->
</p:confirmDialog>
</h:form>
将p:dataTable
和p:confirmDialog
放在一个单独的表单中也应该有效:
<h:form>
<p:dataTable>
<!-- content of data table -->
</p:dataTable>
</h:form>
<h:form>
<p:confirmDialog>
<!-- content of dialog -->
</p:confirmDialog>
</h:form>
您可以在selectedCommandes
的设置器上设置断点,以检查是否已调用此断点。 (别担心是多次调用setter,这很正常。)
答案 1 :(得分:0)
正如你告诉我的那样,我用两种形式测试了一个单独的页面: 这是新的xhtml页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<body>
<ui:composition template="./template_utilisateur.xhtml">
<ui:define name="tohead">
</ui:define>
<ui:define name="content">
Bienvenue #{userController.u1.nom} #{userController.u1.prenom}
<br></br><br></br><br></br>
<h:form id="form">
<p:dataTable id="cars" var="car" value="#{acceuilUserController.lc_maj}" tableStyle="width:auto" rowStyleClass="#{(car.lu == false) ? 'red' : null}" >
<p:column headerText="Commande N° : " style="width:100px">
<h:outputText value="#{car.commande.id}" />
</p:column>
<p:column headerText="Date de mise à jour : " style="width:100px">
<h:outputText value="#{car.dateMaj}" />
</p:column>
<p:column headerText="Decision : " style="width:100px">
<h:outputText value="#{car.decison}" />
</p:column>
<p:column headerText="Etat : " style="width:100px">
<h:outputText value="#{car.etat}" />
</p:column>
<p:column style="width:40px">
<p:commandButton id="selectButton" update=":form:carDlg" oncomplete="carDialog.show()" icon="ui-icon-search" title="plus de détails">
<f:setPropertyActionListener value="#{car}" target="#{acceuilUserController.selectedMajCommande}" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:dialog header="Commande editée le #{acceuilUserController.selectedMajCommande.dateMaj} par l'#{acceuilUserController.selectedMajCommande.utilisateur.type} #{acceuilUserController.selectedMajCommande.utilisateur.nom} #{acceuilUserController.selectedMajCommande.utilisateur.prenom}" widgetVar="carDialog" resizable="false" id="carDlg"
showEffect="fade" hideEffect="explode" modal="true">
<f:ajax event="close" execute="@this" render="cars" listener="#{acceuilUserController.refreshDatatable()}"/>
<table id="gradient-style" >
<tr style="border: hidden;">
<th>
<h:outputLabel value="Model:" />
</th>
<td>
<h:outputLabel style="font-weight: bold;" value="#{acceuilUserController.selectedMajCommande.commande.id}" />
</td>
</tr>
<tr style="border: hidden;">
<th>
<h:outputLabel value="Year:" />
</th>
<td>
<h:outputLabel style="font-weight: bold;" value="#{acceuilUserController.selectedMajCommande.commande.etat}" />
</td>
</tr>
<tr style="border: hidden;">
<th>
<h:outputLabel value="Manufacturer:" />
</th>
<td>
<h:outputLabel style="font-weight: bold;" value="#{acceuilUserController.selectedMajCommande.commande.dateEnvoi}" />
</td>
</tr>
<tr style="border: hidden;">
<th>
<h:outputLabel value="Color:" />
</th>
<td>
<h:outputLabel style="font-weight: bold;" value="#{acceuilUserController.selectedMajCommande.commande.dateLivraisonRecommande}" />
</td>
</tr>
</table>
<table id="gradient-style" >
<th>Nom Fichier</th><th>Taille</th><th>Télécharger</th>
<ui:repeat value="#{acceuilUserController.selectedMajCommande.commande.listFichiers}" var="jjjjj">
<tr>
<td>
<h:outputLabel style="font-weight: bold;" value="#{jjjjj.nom}" />
</td>
<td>
<h:outputLabel style="font-weight: bold;" value="#{jjjjj.taille}" />
</td>
<td>
<h:commandLink value="Télécharger">
<p:fileDownload value="#{jjjjj.convertFichier}" />
</h:commandLink>
</td>
</tr>
</ui:repeat>
</table>
</p:dialog>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
这是selectCommandes的set方法:
public void setSelectedCommandes(Commande[] selectedCommandes) {
System.out.println("je suis la dans son set tous : :"+selectedCommandes.length);
this.selectedCommandes = selectedCommandes;
}
我注意到当我检查一行时,上面的方法没有运行,当我点击时它只运行一次:
<f:facet name="footer">
<p:commandButton id="supprion" value="supprimer selection" update=":form2:displayMulti" oncomplete="confirmation2.show()" />
</f:facet>
在页脚到数据表中,并写成:
Infos: je suis la dans son set tous : :0
你有任何想法,谢谢
答案 2 :(得分:0)
添加
<p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":form:messages" />
下
<p:datatTable>