2012-09-08 22 views
22

我試圖創建具有多個行選擇一個數據表,但我發現這裏的錯誤是本教程http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf的鏈接:啓用選擇時,DataModel必須實現org.primefaces.model.SelectableDataModel。

這裏是我的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> 

託管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; 
} 




} 

我得到這個錯誤:

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

教程鏈接已死亡。工作鏈接是:https://www.primefaces.org/showcase/ui/data/datatable/selection.xhtml – KiriSakow

回答

62

眼前這個屬性rowKey添加到數據表標籤:

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

rowKey屬性的值對於每行都必須是唯一的,並且在任何行中都不能爲null。它可以是幾個值的混合,例如:'rowKey =「#{userObj.id} - #{userObj.name}」' –

+0

由於我有一些過濾列,我發現一個解決方案, filteredValue'指向它的相同類型的對象的列表。 – Izerlotti

+1

@Izerlotti你的評論解決了我的情況。我只想爲下一個陌生人說清楚:當你過濾數據表並且它在某個時刻被重新表達(你改變了製表符或者表達式)時,你需要在你的bean中有一個List的數據表項,並且你需要讓它在你的表的'filteredValue'屬性中設置。在其他地方你會得到'DataModel必須實現org.primefaces.model.SelectableDataModel'異常,這有點令人困惑。 – ba3a

3

或者到rowKey你可以在真正實現org.primefaces.model.SelectableDataModel自定義模型包裝你的數據。這是有益的,如果

  • 所有的類都具有相同類型的@Id(如long),並且可以實現相同的接口(例如EjbWithId
  • 要額外的功能添加到您的數據,這些數據沒有特定領域,不屬於例如User

接口可以是這樣的:

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

則可以使用一個通用的實施SelectableDataModel您的所有類:

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

在你@ManagedBean

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

你可以得到這個e如果您嘗試向基礎列表中添加新項目並忘記爲該新項目的rowKey分配值,則會出現錯誤。

相關問題