wake-up-neo.com

DataModel muss org.primefaces.model.SelectableDataModel implementieren, wenn die Auswahl aktiviert ist.

Ich versuche, eine DataTable mit Multiple Row Selection zu erstellen, aber es wird ein Fehler angezeigt. Hier ist der Link zum Tutorial http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf :

Hier ist mein 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;
}




 }

ich bekomme diesen Fehler:

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

fügen Sie einfach das Attribut rowKey zum datatable-Tag hinzu:

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

Sie können diesen Fehler erhalten, wenn Sie versuchen, der zugrunde liegenden Liste ein neues Element hinzuzufügen und vergessen, dem rowKey dieses neuen Elements einen Wert zuzuweisen.

17
Nublodeveloper

Alternativ zu rowKey können Sie Ihre Daten in ein benutzerdefiniertes Modell einwickeln, das wirklich org.primefaces.model.SelectableDataModel implementiert. Dies ist hilfreich, wenn

  • alle Ihre Klassen haben dieselbe Art von @Id (z. B. eine long) und können dieselbe Schnittstelle (z. B. EjbWithId) implementieren.
  • sie möchten Ihren Daten zusätzliche Funktionalitäten hinzufügen, die nicht domänenspezifisch sind und z. User.

Die Schnittstelle kann etwa so aussehen:

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

Dann kann eine generische Implementierung von SelectableDataModel für alle Ihre Klassen verwendet werden:

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();}
}

In Ihrem @ManagedBean:

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

prüfen Sie zunächst, ob Sie rowKey = "# {userObj.id}" hinzugefügt haben  

dann müssen Sie die Datentabelle List ingefiltertesWertAttribut Ihrer Datentabelle in xhtml anstelle vonvaluesetzen.

0
Sayan Kundu