问题
I have a problem with primefaces datatable which implements filtering and sorting and select row(like complexe datatable in primefaces showcases), when i sort or filter in datatable, SelectedElement resolve to null if i select a row, but if i select row without filtering or sorting, select event work perfectly. Sorry for my bad english.
My xhtml.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Liste des Prospects</title>
<style type="text/css">
</style>
</h:head>
<h:body>
<p:layout style="min-width:900px;min-height:400px;" id="layout" fullPage="true">
<p:layoutUnit size="50" position="north" ><ui:include src="/Menus.xhtml" /></p:layoutUnit>
<h:form id="form">
<p:layoutUnit position="center" size="230" resizable="false" closable="true" collapsible="true">
<p:layout>
<p:layoutUnit position="center">
<p:dataTable id="cars" scrollable="true" frozenColumns="4"
selection="#{prospectBean.selectedProspect}" selectionMode="single" stickyHeader="false" var="listd"
sortMode="single" widgetVar="ProspectTable" value="#{prospectBean.list}" rowKey="#{listd.idProspect}"
emptyMessage="Pas de prospects avec ces critères" rowSelectMode="single" filteredValue="#{prospectBean.filteredProspects}">
<p:ajax event="rowSelect" listener="#{prospectBean.onRowSelect}" update=":form:Agenda" />
<p:ajax event="rowUnselect" listener="#{prospectBean.onRowUnSelect()}"/>
<p:ajax event="filter" update=":form:cars" />
<f:facet name="header" >
<p:outputPanel >
<h:outputText style="width:150px;" value="Chercher dans tous les camps:" />
<p:inputText id="globalFilter" onkeyup="PF('ProspectTable').filter()" style="width:150px;" placeholder="Enter keyword"/>
<p:commandButton action="#{prospectBean.AjouterProspect()}" style="width:12%;float: left;height:8%" ajax="false" icon="ui-icon-circle-plus" />
</p:outputPanel>
</f:facet>
<p:column width="14" >
<p:commandButton action="#{prospectBean.ModifierProspect(listd)}" style="width:15px;height:15px" ajax="false" icon="ui-icon-pencil"/>
</p:column>
<p:column width="140" sortBy="#{listd.raisonsociale}" headerText="Raison Sociale" filterBy="#{listd.raisonsociale}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.raisonsociale}"/>
</p:column>
<p:column width="140" sortBy="#{listd.raisonsocialeabrg}" headerText="RS Abrégé" filterBy="#{listd.raisonsocialeabrg}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.raisonsocialeabrg}"/>
</p:column>
<p:column width="140" sortBy="#{listd.telephone}" headerText="Téléphone" filterBy="#{listd.telephone}" filterStyle="display:none">
<h:outputText value="#{listd.telephone}"/>
</p:column>
<p:column width="140" sortBy="#{listd.telephone2}" headerText="Téléphone 2" filterBy="#{listd.telephone2}" filterStyle="display:none">
<h:outputText value="#{listd.telephone2}"/>
</p:column>
<p:column width="140" sortBy="#{listd.fax}" headerText="Fax" filterBy="#{listd.fax}" filterStyle="display:none">
<h:outputText value="#{listd.fax}"/>
</p:column>
<p:column width="190" sortBy="#{listd.siteWeb}" headerText="Site Web" filterBy="#{listd.siteWeb}" filterStyle="display:none">
<h:outputText value="#{listd.siteWeb}"/>
</p:column>
<p:column width="190" sortBy="#{listd.email}" headerText="Email" filterBy="#{listd.email}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.email}"/>
</p:column>
<p:column width="140" sortBy="#{listd.ville}" headerText="Ville" filterBy="#{listd.ville}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.ville}"/>
</p:column>
<p:column width="140" sortBy="#{listd.pays}" headerText="Pays" filterBy="#{listd.pays}" filterMatchMode="contains" filterStyle="display:none" >
<h:outputText value="#{listd.pays}"/>
</p:column>
<p:column width="140" sortBy="#{listd.chiffreaffaire}" headerText="Chiffre d'affaire" filterBy="#{listd.chiffreaffaire}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.chiffreaffaire}"/>
</p:column>
<p:column width="140" sortBy="#{listd.activite}" headerText="Activite" filterBy="#{listd.activite}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.activite}"/>
</p:column>
<p:column width="140" sortBy="#{listd.secteur}" headerText="Secteur" filterBy="#{listd.secteur}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.secteur}"/>
</p:column>
<p:column width="140" sortBy="#{listd.statut.denomination}" headerText="Statut" filterBy="#{listd.statut.denomination}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText value="#{listd.statut.denomination}"/>
</p:column>
</p:dataTable>
</p:layoutUnit>
<p:layoutUnit position="south" size="322" resizable="false" closable="true" collapsible="true">
<p:dataTable id="Agenda" scrollable="false" filteredValue="#{AgendaBean.filteredAgenda}"
selectionMode="single" var="lista" sortMode="single"
widgetVar="AgendaTable" value="#{AgendaBean.list}" rowKey="#{lista.id}"
emptyMessage="Pas d'événement avec ces critères" >
<f:facet name="header" >
<p:outputPanel >
<h:outputText style="width:150px;" value="Chercher dans tous les camps:" />
<p:inputText id="globalFilter" onkeyup="PF('AgendaTable').filter()" style="width:150px;" placeholder="Enter keyword"/>
<p:commandButton action="#{AgendaBean.AjouterAgenda()}" rendered="#{prospectBean.checked}" style="width:12%;height:6%;float: left;" ajax="false" icon="ui-icon-circle-plus" />
</p:outputPanel>
</f:facet>
<p:column width="17" >
<p:commandButton action="#{AgendaBean.ModifierAgenda(lista)}" style="width:15px; height:17px" ajax="false" icon="ui-icon-pencil"/>
</p:column>
<p:column sortBy="#{lista.dateHeure}" width="170" headerText="Date Heure" filterBy="#{lista.dateHeure}" filterMatchMode="contains" filterStyle="display:none" >
<h:outputText id="id01" value="#{lista.dateHeure}"/>
</p:column>
<p:column sortBy="#{lista.natureevenement.libelle}" headerText="Nature" filterBy="#{lista.natureevenement.libelle}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText id="id11" value="#{lista.natureevenement.libelle}"/>
</p:column>
<p:column sortBy="#{lista.intervenant.nom}" headerText="Intervenant" filterBy="#{lista.intervenant.nom}" filterMatchMode="contains" filterStyle="display:none" >
<h:outputText id="id21" value="#{lista.intervenant.nom}"/>
</p:column>
<p:column sortBy="#{lista.statut.denomination}" headerText="Statut" filterBy="#{lista.statut.denomination}" filterMatchMode="contains" filterStyle="display:none" >
<h:outputText id="id31" value="#{lista.statut.denomination}"/>
</p:column>
<p:column sortBy="#{lista.duree}" width="70" headerText="Duree" filterBy="#{lista.duree}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText id="id41" value="#{lista.duree}"/>
</p:column>
<p:column sortBy="#{lista.lieu}" width="170" headerText="Lieu" filterBy="# {lista.lieu}" filterMatchMode="contains" filterStyle="display:none">
<h:outputText id="id61" value="#{lista.lieu}"/>
</p:column>
</p:dataTable>
</p:layoutUnit>
</p:layout>
</p:layoutUnit>
</h:form>
</p:layout>
</h:body>
</html>
MyBean
@ManagedBean(name="prospectBean")
@SessionScoped
public class ProspectBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
....
public void onRowSelect(SelectEvent se)
{
setProspect(getSelectedProspect());
agendabean.setProspect(getSelectedProspect());
checked=true;
try{
AgendaBean.AfficherAgendas(getProspect());
}catch(Exception e){e.printStackTrace();}
System.out.print("ca marche encore");
}
public void onRowUnSelect(SelectEvent se)
{
checked=false;
}
//agendabean.setProspect(getSelectedProspect()); resolve to null pointer exception
java.lang.NullPointerException
at Interface.AgendaBean.AfficherAgendas(AgendaBean.java:508)
at Interface.ProspectBean.onRowSelect(ProspectBean.java:775)
Very sorry for my bad english :p thanks !
来源:https://stackoverflow.com/questions/23761333/primefaces-datatable-row-select-not-work-after-filtering-or-sorting