首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >启用选择时,DataModel必须实现org.primefaces.model.SelectableDataModel。

启用选择时,DataModel必须实现org.primefaces.model.SelectableDataModel。
EN

Stack Overflow用户
提问于 2012-09-09 03:25:01
回答 4查看 89K关注 0票数 36

我正在尝试创建一个具有多行选择的DataTable,但我收到了一个错误,以下是教程http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf的链接:

下面是我的xhtml:

代码语言:javascript
复制
    <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:

代码语言:javascript
复制
 @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;
}




 }

我得到了这个错误:

代码语言:javascript
复制
  javax.faces.FacesException: DataModel must implement     
  org.primefaces.model.SelectableDataModel when selection is enabled.....
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-09 03:42:26

只需将此属性rowKey添加到datatable标记:

代码语言:javascript
复制
<p:dataTable border="1" value="#{projectAdminisrationMB.projectNoUsersList}" 
 var="userObj"
 rowKey="#{userObj.name}"selection="#{projectAdminisrationMB.selectedUsers}"
 selectionMode="multiple" rowIndexVar="rowIndex"
 binding="#{table2}">
票数 86
EN

Stack Overflow用户

发布于 2013-03-21 22:28:33

如果您尝试将新项添加到基础列表中,但忘记为该新项的rowKey赋值,则可能会出现此错误。

票数 19
EN

Stack Overflow用户

发布于 2012-09-09 15:27:26

或者,对于rowKey,您可以将数据包装在真正实现org.primefaces.model.SelectableDataModel的自定义模型中。这在以下情况下很有帮助

  • 您的所有类都具有相同类型的@Id (例如,long)并且可以实现相同的接口(例如,EjbWithId)
  • you想要向您的数据添加不特定于领域且不属于的附加功能,例如User.

界面可能如下所示:

代码语言:javascript
复制
public interface EjbWithId
{
  public long getId();
  public void setId(long id);
}

然后,可以为您的所有类使用SelectableDataModel的通用实现:

代码语言:javascript
复制
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

代码语言:javascript
复制
private PrimefacesEjbIdDataModel<User> dmUser; //+getter
dmUser = new PrimefacesEjbIdDataModel<User>(administrationProjectFinal.getUserList());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12333764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档