0

私は以下のようなデータテーブルを持っています:

<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つのアイテムを持つ1つのドロップダウンが含まれています。「生成」ボタンがあります。ドロップダウンアイテムを選択して[生成]ボタンをクリックすると、最初の9行ではコンポーネントIDが表示されず、10行目では機能します。

ここでの問題はレポートの生成に関するものではありません。問題は、JSFが各行のドロップダウンごとに異なるコンポーネントIDを取得しないことです。試しid="reportID"ましたが、成功しませんでした。rowKey="#{transacVAR.OID}"テーブルの行キー値をとして指定しようとしましid="#{transacVAR.OID}"たが、「空のコンポーネントID」などの例外がスローされます。

この問題をどのように解決する必要がありますか?

4

1 に答える 1

1

あなたの問題はコンポーネントIDとは何の関係もありません。この問題は、送信されたすべての行の値を1つの同じBeanプロパティにバインドしているために発生します。JSFは、入力要素がツリーに表示される順序に基づいて、送信された値を処理します。したがって、JSFは、最後の行に到達するまで、すべての行に対して送信された値を使用してまったく同じsetterメソッドを呼び出します。最終的に最後の行の値になります。setterメソッドにブレークポイントを設定した場合、その後、個々の行ごとに異なる値で呼び出されることに気付くでしょう。

代わりに、値を現在繰り返されている行オブジェクトにバインドする必要があります。

<p:selectOneMenu value="#{transacVAR.summaryTxnReportSelected}">
于 2012-12-20T11:33:04.847 に答える