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>
<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.....
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}">
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.
Alternativ zu rowKey
können Sie Ihre Daten in ein benutzerdefiniertes Modell einwickeln, das wirklich org.primefaces.model.SelectableDataModel
implementiert. Dies ist hilfreich, wenn
@Id
(z. B. eine long
) und können dieselbe Schnittstelle (z. B. EjbWithId
) implementieren.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());
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.