2012-09-08 30 views
22

मैं एकाधिक पंक्ति चयन के साथ एक DataTable बनाने के लिए कोशिश कर रहा हूँ, लेकिन मैं यहाँ एक त्रुटि हो रही है ट्यूटोरियल http://www.primefaces.org/showcase/ui/datatableRowSelectionMultiple.jsf का लिंक भी हैडेटामोडेल को चयन सक्षम होने पर org.primefaces.model.SelectableDataModel को लागू करना होगा।</p> <p>यहाँ मेरी एक्सएचटीएमएल है:

<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> 

प्रबंधित बीन:

@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

सिर्फ datatable टैग में यह विशेषता rowKey जोड़ें: आप जो वास्तव में org.primefaces.model.SelectableDataModel लागू करता कस्टम मॉडल में अपने डेटा को लपेट कर सकते हैं

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

पंक्ति के लिए मान प्रत्येक पंक्ति के लिए अद्वितीय होना आवश्यक है और यह किसी भी पंक्ति में शून्य नहीं हो सकता है। यह कई मानों का मिश्रण हो सकता है जैसे: 'rowKey = "# {userObj.id} - # {userObj.name}" ' –

+0

चूंकि मेरे पास फ़िल्टरिंग के साथ कुछ कॉलम थे, इसलिए मुझे एक समाधान मिला जो विशेषता के लिए एक मूल्य भी जोड़ रहा था। फ़िल्टर किए गए वैल्यू 'इसे उसी प्रकार की वस्तुओं की सूची में इंगित करता है। – Izerlotti

+1

@Izerlotti आपकी टिप्पणी ने मेरे मामले में समस्या हल की। मैं इसे अगले अजनबियों के लिए स्पष्ट करना चाहता हूं: जब आप डेटाटेबल फ़िल्टर करते हैं और यह कुछ पल में फिर से रेंडर किया जाता है (आप टैब या smth बदलते हैं), तो आपको अपने बीन में डेटाटेबल आइटमों की 'सूची' की आवश्यकता होती है और आपको इसकी आवश्यकता होती है क्या यह आपकी तालिका के 'फ़िल्टर किए गए वैल्यू' विशेषता में सेट है। कहीं और आपको 'DataModel को org.primefaces.model.SelectableDataModel' अपवाद लागू करना होगा, यह थोड़ा उलझन में है। – ba3a

3

वैकल्पिक रूप से rowKey करने के लिए। यह उपयोगी है अगर

    अपने अपने वर्गों में से
  • सभी @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

आप यह ई प्राप्त कर सकते हैं अगर आप अंतर्निहित सूची में कोई नया आइटम जोड़ने का प्रयास करते हैं और उस नए आइटम की पंक्ति के लिए मान असाइन करना भूल जाते हैं तो rror।