2012-10-23 29 views
0

我正在使用primefaces數據表來顯示數據列表。我希望我的用戶能夠選擇多行,之後將對選定行所代表的數據執行操作。一切運作良好,直到我發現選擇無法解決的地方執行操作。從primefaces數據表中選擇項目不工作

下面是我的XHTML頁面

<h:form enctype="multipart/form-data" id="upload"> 
<primefaces-p:panel closable="false" collapsed="false" header="Excel Contact Uploader" id="pnlupload" rendered="true" toggleable="false" visible="true" widgetVar="pnlupload"> 

<primefaces-p:growl id="msg" showDetail="true" life="3000" showSummary="true"> 

</primefaces-p:growl> 
     <primefaces-p:fileUpload auto="true" 
     allowTypes="/(\.|\/)(xls)$/" 
     sizeLimit="1024000" 
     mode="advanced" 
     multiple="true" invalidFileMessage="Invalid file type" invalidSizeMessage="File too large" dragDropSupport="true" fileUploadListener="#{excelFileController.handleFileUpload}" showButtons="true" update="msg, tblcontacts 
     " required="false"/> 


     <br /> 
<br /> 


     <primefaces-p:scrollPanel rendered="true" style="height:200px;"> 
      <primefaces-p:dataTable emptyMessage="No Contacts Uploaded" id="tblcontacts" rendered="true" rows="8" 
      value="#{excelFileController.contacts}" var="contact" style="width:50pc;"> 
     <primefaces-p:column style="width:18px" headerText="Select"> 
     <h:selectBooleanCheckbox value="#{contact.selected}" /> 

     </primefaces-p:column> 

     <primefaces-p:column headerText="File Name"> 
     #{contact.groupName} 
     </primefaces-p:column> 
     <primefaces-p:column headerText="Number of Contacts"> 
     #{contact.numberofentries} 
    </primefaces-p:column> 
    <primefaces-p:column> 
    <h:button outcome="blkedit?faces-redirect=true" rendered="true" value="Edit"> 
     <f:param name="contact" value="#{contact.contactId}"/> 
     </h:button> 
    </primefaces-p:column> 
    </primefaces-p:dataTable> 
    </primefaces-p:scrollPanel> 

<br /> 
</primefaces-p:panel> 
<h:commandButton value="Delete" id="btndelete" action="#{excelFileController.removeContact}" immediate="true" disabled="false" rendered="true"/> 
<h:message for="btndelete" /> 
</h:form> 

和下面是我支持bean

@Named 
@ViewAccessScoped 
public class ExcelFileController implements Serializable, IFileController { 

/** 
* 
*/ 
private static final long serialVersionUID = -8117258104485487921L; 

@Inject 
PhoneNumberFormatter formatter; 

@Inject 
@Authenticated 
UserProfile profile; 

public PhoneNumberFormatter getFormatter() { 
    return formatter; 
} 

public void setFormatter(PhoneNumberFormatter formatter) { 
    this.formatter = formatter; 
} 

@EJB 
BulkContactDeleter deleter; 

@Inject 
Logger logger; 

@Inject 
@CurrentContext 
FacesContext context; 

@Inject 
BulkSMSContactListProducer listProducer; 

@Inject 
ConfigurationListProducer producer; 

private BulkSMSContacts[] contactsSelected; 

private List<BulkSMSContacts> contacts; 

public BulkSMSContacts[] getContactsSelected() { 
    return contactsSelected; 
} 

public void setContactsSelected(BulkSMSContacts[] contactsSelected) { 
    this.contactsSelected = contactsSelected; 
} 

/* 
* public BulkContactDataModel getContactDataModel() { return 
* contactDataModel; } 
*/ 

@PostConstruct 
public void init() { 
    logger.log(Level.INFO, "Entering excel file controller"); 
    /* 
    * contactDataModel = new BulkContactDataModel(
    * listProducer.getBulkSMSContacts()); 
    */ 
    this.contacts = listProducer.getBulkSMSContacts(); 

} 

@Override 
public String removeContact() { 
    int contactsdeleted = 0; 

    if (this.contacts != null) { 
     /* 
     * for (BulkSMSContacts contacts : contactsSelected) { if (contacts 
     * != null) { deleter.deleteContact(contacts); contactsdeleted += 1; 
     * } 
     */ 
     for (BulkSMSContacts c : contacts) { 
      if (c.isSelected()) { 

       deleter.deleteContact(c); 
       contactsdeleted += 1; 
      } 

     } 
     contacts = listProducer.getBulkSMSContacts(); 

     logger.log(Level.INFO, "Deleted " + contactsdeleted + " Contacts"); 
     context.addMessage(null, new FacesMessage(
       FacesMessage.SEVERITY_INFO, "Success", contactsdeleted 
         + " entries where deleted successfully")); 
    } else { 
     context.addMessage(null, new FacesMessage(
       FacesMessage.SEVERITY_ERROR, "Error", 
       "No contact file was selected!")); 
    } 
    return null; 
} 

public List<BulkSMSContacts> getContacts() { 
    return contacts; 
} 

public void setContacts(List<BulkSMSContacts> contacts) { 
    this.contacts = contacts; 
} 

}

下面是我的模型定義

@Entity 
public class BulkSMSContacts implements Serializable { 

private static final long serialVersionUID = -6444763251149211384L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@XmlAttribute 
private long contactId; 

@XmlElement 
@NotNull(message = "message.validator.notnull") 
@Size(min = 9, max = Integer.MAX_VALUE, message = "message.validator.size") 
@Column(nullable = false, length = Integer.MAX_VALUE, unique = false) 
@Basic(fetch = FetchType.EAGER) 
private String contacts; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "Id", nullable = false) 
@XmlElement(type = SMSAccount.class) 
private SMSAccount account; 

@NotNull(message = "message.validator.notnull") 
@Size(min = 2, max = 100, message = "message.validator.size") 
@Column(length = 100, nullable = false, unique = false) 
@XmlElement 
private String groupName; 

@Column(nullable = true) 
private int numberofentries = 0; 

@javax.persistence.Transient 
private boolean selected; 

//getters and setters 

的問題是,當時單擊刪除按鈕(雖然調用removeContact()方法時)。所有行評估爲沒有被選中。

我也嘗試使用primefaces展示方法,但仍然是示例問題。

請問我做錯了什麼?

回答

2

我不明白爲什麼在實體類中設置選擇屬性。 嘗試做這樣

  1. 設置一個數據模型:

    public class BulkSMSContactsDataModel extends ListDataModel<BulkSMSContacts> implements SelectableDataModel<BulkSMSContacts> {  
    
    public BulkSMSContactsDataModel() { 
    } 
    
    public BulkSMSContactsDataModel(List<BulkSMSContacts> data) { 
        super(data); 
    } 
    
    @Override 
    public BulkSMSContacts getRowData(String rowKey) {   
        List<BulkSMSContacts> contacts = (List<BulkSMSContacts>) new yourDao.getListOfBulkSMSContacts(); //yourDAO :BulkSMSContactsSelector i guess 
        for(BulkSMSContacts c : contacts) { 
         if(String.valueOf(c.getContactId()).equals(rowKey)) 
          return c; 
        } 
    
        return null; 
    } 
    
    @Override 
    public Object getRowKey(BulkSMSContacts obj) { 
        return String.valueOf(obj.getContactId()); 
    } 
    

    }

  2. 配置你的bean:

    public class ExcelFileController implements Serializable, IFileController { 
        private BulkSMSContacts[] contactsSelected; 
        private List<BulkSMSContacts> contacts; 
        private BulkSMSContacts[] selectedcontacts; 
        private BulkSMSContactsDataModel contactsList; 
         public ExcelFileController() { 
         contactsList = new BulkSMSContactsDataModel(contacts); 
        } 
        // getters and setters 
        // the rest of your code 
    

    }

  3. 配置您的XHTML

    <p:dataTable emptyMessage="No Contacts Uploaded" id="tblcontacts" rendered="true" rows="8" value="#{excelFileController.contactsList}" var="contact" style="width:50pc;" selection="#{excelFileController.selectedcontacts}"> 
         <p:column selectionMode="multiple" style="width:20px" /> 
         <p:column headerText="File Name"> 
         #{contact.groupName} 
         </p:column> 
         <p:column headerText="Number of Contacts"> 
         #{contact.numberofentries} 
         </p:column> 
         <!-- the rest --> 
    

  4. 更新你的UI。

  5. 使用P的代替primefaces-P這將使它更容易閱讀你的代碼。 :)

+0

我已經嘗試了上述解決方案,主要問題是ListDataModel實現中的CDI注入不起作用,因爲所有注入的工件最終都會解析爲null。謝謝,但歡迎提出建議 –

1

爲了知道所選擇的contacts,dataTable和UI命令組件,即<h:commandButton><p:commandButton>等必須是相同的形式。這意味着,您的聯繫人數據表和您的刪除按鈕必須是相同的<h:form>

<h:form> 
     <!-- based in your code (pretty odd by the way)... --> 
     <primefaces-p:dataTable emptyMessage="No Contacts Uploaded" id="tblcontacts" 
      rendered="true" rows="8" value="#{excelFileController.contacts}" 
      var="contact" style="width:50pc;"> 
      <!-- your columns... --> 
     </primefaces-p:dataTable> 
     <primefaces-p:commandButton value="Delete contacts" 
      action="#{excelFileController.removeContact}" /> 
    </h:form> 

裏面此外,檢查你沒有在你的頁面嵌套形式。

更多信息:


這個問題似乎是在CDI註解。爲了讓你的ExcelFileController處於活動狀態,需要在某處初始化對話(在代碼中沒有顯示任何內容)。另一種解決方案是使用JSF註釋來代替:

//@Named 
//@ViewAccessScoped 
@ManagedBean 
@ViewScoped 
public class ExcelFileController implements Serializable, IFileController { 
    //rest of your code... 
} 
+0

我已經更新了xhtml頁面以顯示反映事物的真實情況。我的網頁是在你問這個問題之前說的。 –

+0

@PeterEdike答案已更新。 –

+0

我已經試過了,沒有工作。當點擊刪除按鈕時,我仍然會收到「已選擇0個聯繫人」消息。無論如何感謝您的答覆 –