2012-12-20 27 views
0

我有数据表像之下,以获得不同的组件ID为一行中的每个下拉:如何使用JSF

<p:dataTable id="transactionTableID" binding="#{transactionReportBean.dataTable}" 
    value="#{transactionReportBean.summarizedDateWiseTransactionList}" 
    var="transacVAR" rowKey="#{transacVAR.OID}" style="float:center;"> 

    <p:column headerText="#{build.reportSelection}"> 
     <p:selectOneMenu id="" value="#{transactionReportBean.summaryTxnReportSelected}" > 
      <f:selectItem itemLabel="-Select One-" itemValue="-Select One-"/> 
      <f:selectItem itemLabel="#{build.matchedreport}" itemValue="#{build.matchedreport}"/> 
      <f:selectItem itemLabel="#{build.carryforwardreport}" itemValue="#{build.carryforwardreport}"/> 
      <f:selectItem itemLabel="#{build.exceptionreport}" itemValue="#{build.exceptionreport}"/> 
     </p:selectOneMenu> 
     <p:commandButton update="@form" value="Generate" ajax="false" 
      actionListener="#{transactionReportBean.getReportSelected}" /> 
    </p:column> 
</p:dataTable> 

和动作监听器方法如下图所示:

public void getReportSelected(){ 
    if(this.SummaryTxnReportSelected.equalsIgnoreCase("-Select One-")||this.SummaryTxnReportSelected.equalsIgnoreCase(null)){ 
     this.message = AlgoMessageHandler.getMessage(AlgoMessageHandler.USER_MSG, "ERR0048"); 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                 this.getMessage(), AFTSConstants.BLANK_STRING)); 
    } else { 
     this.selectedDtTxn= (TransactionsSummaryReportVO) dataTable.getRowData(); 
     System.out.println("listener called "+this.getSummaryTxnReportSelected()+" Selected transaction ID "+selectedDtTxn.getExecutionID()); 
     String reportname = generateJasperReport(this.getSummaryTxnReportSelected(),AFTSConstants.SUMMARY_TXN_REPORT,this.selectedDtTxn); 
     System.out.println("Report Name"+reportname); 
     this.summaryReportStored= AFTSConstants.SUMMARY_REPORT_STORED_PATH+reportname+".pdf"; 
     System.out.println(this.summaryReportStored); 
     this.setRenderGenerateButton(false); 
    } 
} 

这种方法是关于根据我们选择的下拉项目生成报告。在我的表格中,我有10行,每行包含一个有3个项目的下拉菜单。有一个“生成”按钮。选择下拉菜单并单击“生成”按钮后,对于前9行,它不会给出组件ID,对于第10行它将起作用。

这里的问题不在于生成报告,问题在于JSF不会为每行中的每个下拉列表使用不同的组件ID。我试过id="reportID",但没有成功。我试图给表rowKey="#{transacVAR.OID}"的行键值为id="#{transacVAR.OID}",但它会抛出一个异常,如“空的组件ID”。

我该如何解决这个问题?

回答

1

您的问题与组件ID无关。您的问题是由于您将所有行的提交值绑定到同一个bean属性而引起的。 JSF根据输入元素在树中出现的顺序来处理提交的值。因此,JSF将调用与每个行提交的值完全相同的setter方法,直到达到最后一行。最后一行的值最终结束。如果你在setter方法上放置了一个断点,你会注意到它随后被从每一行中调用不同的值。

您需要将该值绑定到当前迭代的行对象。

<p:selectOneMenu value="#{transacVAR.summaryTxnReportSelected}">