2012-09-08 10 views
22

Sto cercando di creare un DataTable con selezione di riga multipla ma sto ottenendo un errore Ecco il link del tutorial http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf:DataModel deve implementare org.primefaces.model.SelectableDataModel quando la selezione è abilitata.

Ecco il mio xhtml:

<p:dataTable border="1" value="#{projectAdminisrationMB.projectNoUsersList}" 
        var="userObj" 
        selection="# 
     {projectAdminisrationMB.selectedUsers}" 
selectionMode="multiple" rowIndexVar="rowIndex"binding="#{table2}"> 
<p:column id="column3"> 
<f:facet name="header"> 
<h:outputText value=" user "></h:outputText> 
</f:facet> 

     <h:outputText value="#{userObj.name}"/> 

          /
    <h:outputText value="#{userObj.lastName}"></h:outputText> 

    &nbsp; 
    <h:outputText value="#{userObj.firstName}"></h:outputText> 
    </p:column> 

    <f:facet name="footer"> 
    <p:commandButton id="addProjectUser" value=" Add " onclick="dlg1.show()" /> 
     <p:commandButton id="deleteProjectUser" value=" Delete " /> 

    </f:facet> 

</p:dataTable> 

Managed Bean:

@ManagedBean 
@SessionScoped 
public class ProjectAdminisrationMB implements Serializable { 

private static final long serialVersionUID = 1L; 

private String projectName; 
private List <User> projectUsersList; 
private List<User> projectNoUsersList; 
private List<User> selectedUsers; 

private String projectAdmin; 


public ProjectAdminisrationMB() { 
    super(); 
    AdministrationProjectFinal administrationProjectFinal =new  
      AdministrationProjectFinal(); 
    this.projectUsersList=administrationProjectFinal.getUserList(); 
    this.projectNoUsersList=administrationProjectFinal.getNotUserList(); 
} 



public String getProjectName() { 
    return projectName; 
} 

public void setProjectName(String projectName) { 
    this.projectName = projectName; 
} 



public List<User> getProjectUsersList() { 
    return projectUsersList; 
} 



public void setProjectUsersList(List<User> projectUsersList) { 
    this.projectUsersList = projectUsersList; 
} 



public String getProjectAdmin() { 
    return projectAdmin; 
} 

public void setProjectAdmin(String projectAdmin) { 
    this.projectAdmin = projectAdmin; 
} 

public List<User> getProjectNoUsersList() { 
    return projectNoUsersList; 
} 



public void setProjectNoUsersList(List<User> projectNoUsersList) { 
    this.projectNoUsersList = projectNoUsersList; 
} 



public List<User> getSelectedUsers() { 
    return selectedUsers; 
} 



public void setSelectedUsers(List<User> selectedUsers) { 
    this.selectedUsers = selectedUsers; 
} 




} 

sto ottenendo questo errore:

javax.faces.FacesException: DataModel must implement  
    org.primefaces.model.SelectableDataModel when selection is enabled..... 
+0

Il link dell'esercitazione è morto. Il link di lavoro è: https://www.primefaces.org/showcase/ui/data/datatable/selection.xhtml – KiriSakow

risposta

62

Basta aggiungere questo attributo rowKey al tag datatable:

<p:dataTable border="1" value="#{projectAdminisrationMB.projectNoUsersList}" 
var="userObj" 
rowKey="#{userObj.name}"selection="#{projectAdminisrationMB.selectedUsers}" 
selectionMode="multiple" rowIndexVar="rowIndex" 
binding="#{table2}"> 
+13

Il valore dell'attributo rowKey deve essere univoco per ogni riga e questo non può essere nullo in nessuna riga. Può essere un insieme di diversi valori, ad es .: 'rowKey =" # {userObj.id} - # {userObj.name} "' –

+0

Dato che avevo alcune colonne con filtro, ho trovato una soluzione aggiungendo anche un valore per l'attributo ' filteredValue' puntandolo a un elenco dello stesso tipo di oggetti. – Izerlotti

+1

@Izerlotti Il tuo commento ha risolto il problema nel mio caso. Vorrei solo chiarire per i seguenti sconosciuti: quando si filtra datatable ed è in qualche momento rerenderizzato (si cambiano tab o smth), è necessario avere un 'Elenco' di elementi datatable nel bean e occorre impostarlo nell'attributo 'filteredValue' della tabella. Altrove avrai 'DataModel deve implementare l'eccezione org.primefaces.model.SelectableDataModel', questo è un po 'di confusione. – ba3a

3

alternativa a rowKey si può avvolgere i vostri dati in un modello personalizzato che in realtà implementa org.primefaces.model.SelectableDataModel. Questo è utile se

  • tutte le vostre classi hanno lo stesso tipo di @Id (ad esempio un long) e in grado di implementare la stessa interfaccia (ad es EjbWithId)
  • si desidera aggiungere ulteriori funzionalità ai dati che sono non specifico del dominio e non appartengono ad es User.

L'interfaccia può essere qualcosa di simile:

public interface EjbWithId 
{ 
    public long getId(); 
    public void setId(long id); 
} 

Poi un'implementazione generica di SelectableDataModel per tutte le classi possono essere utilizzati:

public class PrimefacesEjbIdDataModel <T extends EjbWithId> 
     extends ListDataModel<T> implements SelectableDataModel<T> 
{  
    public PrimefacesEjbIdDataModel(List<T> data) 
    { 
    super(data); 
    } 

    @Override public T getRowData(String rowKey) 
    { 
    List<T> list = (List<T>) getWrappedData(); 

    for(T ejb : list) 
    { 
     if(ejb.getId()==(new Integer(rowKey))){return ejb;} 
    } 
    return null; 
    } 

    @Override public Object getRowKey(T item) {return item.getId();} 
} 

Nel vostro @ManagedBean:

private PrimefacesEjbIdDataModel<User> dmUser; //+getter 
dmUser = new PrimefacesEjbIdDataModel<User>(administrationProjectFinal.getUserList()); 
12

È possibile ottenere questo e rror se si prova ad aggiungere un nuovo elemento all'elenco sottostante e si dimentica di assegnare un valore al rowKey di quel nuovo oggetto.

Problemi correlati