3

単一行の選択とページネーションを備えたprimefacesデータテーブルを使用しています。行ごとに、ユーザーがその行で操作 (例: 削除、編集) を実行するためにクリックするコマンドリンク (そのうちの 1 つが無効になっています) があります。ユーザーが右の行のボタンをクリックしたことを視覚的に確認するために、クリックすると行が選択され、目的の Bean メソッドに進みます。テーブルが 1 ページしかない場合、またはテーブルが 1 ページの場合、これは意図したとおりに機能します。他のすべてのページでは、NullPointerException が発生します。
これが発生する理由がわかりました。選択を実行するためにrowIndexVarを使用していますが、テーブル全体に関連するインデックスを返しているようで、selectRowメソッドは現在のページに関連するインデックスを期待しています。つまり、1 ページに 10 行あり、2 ページ目の 3 行目をクリックすると、返されるインデックスは "2" ではなく "12" になり、selectRow(12, false) は null を返します。ページ。

私の質問は、正しいrowIndexを渡して、すべてのページで正しい選択を取得するにはどうすればよいですか?

バッキング Bean は ViewScoped であり、メソッドは特別なものではありませんが、Web サービスと jaxb によって生成されたクラスに関連する多くのコードがあり、NDA に署名したため、ここに貼り付けることはできません (共有することで既にプッシュしています)。データ可能なコード)。

<p:dataTable id="dataTable" var="item" rowIndexVar="rowIndex"
    value="#{dgRefTypePubBean.itemList}"      
    widgetVar="itemsTable"
    filteredValue="#{dgRefTypePubBean.filteredItems}" paginator="true"
    rows="10"
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    rowsPerPageTemplate="2,5,10,20" rowKey="#{item.EID}"
    selection="#{dgRefTypePubBean.selectedItem}" selectionMode="single"
    emptyMessage="#{msgs['dgreftype.datatable.message.emptyList']}"
    resizableColumns="false">

    <p:ajax event="page" oncomplete="itemsTable.unselectAllRows(); itemsTable.selectRow(0, false)" />
    <p:ajax event="rowSelect" listener="#{dgRefTypePubBean.onRowSelect}"
        update=":form:obs :form:index_info :form:elimination_just :form:left_footer :form:right_footer" />
    <p:ajax event="rowUnselect" listener="#{dgRefTypePubBean.onRowUnselect}" update=":form:obs" />

    <p:column style="text-align:right; width:22px; border:none; background:white">
        <h:graphicImage rendered="#{item.EState==2}" library="images" name="data-delete.png" width="15" height="15" style="border:none; padding:0" />
    </p:column>
    <p:column id="codColumn" headerText="#{msgs['dgreftype.datatable.label.functionalCode']}" filterStyle="height:10px; font-weight:normal" style="text-align:left; width:120px" filterBy="#{item.EFunctionalCode}">
        <h:outputText value="#{item.EFunctionalCode}" />
    </p:column>
    <p:column id="designationColumn" headerText="#{msgs['dgreftype.datatable.label.name']}" filterStyle="height:10px; font-weight:normal" style="text-align:left; word-wrap: break-word" filterBy="#{item.EName}">
        <h:outputText value="#{item.EName}" />
    </p:column>
    <p:column id="variableColumn" headerText="#{msgs['dgreftype.datatable.label.variableTypeName']}" filterStyle="height:10px; font-weight:normal" style="text-align:left; width:200px" filterBy="#{item.EVariableTypeName}">
        <h:outputText value="#{item.EVariableTypeName}" />
    </p:column>
    <p:column id="buttonsColumn" style="width:55px">
        <h:panelGrid columns="3" style="border-collapse:separate; border:none !important">
            <h:commandLink onclick="itemsTable.unselectAllRows(); itemsTable.selectRow(#{rowIndex}, false)" action="#{dgRefTypePubBean.editSelectedItem()}">
                <h:graphicImage library="images" name="edit-text.png" width="15" height="15" style="border:none" />
            </h:commandLink>
            <h:graphicImage library="images" name="detail-disabled.png" width="15" height="15" style="border:none" onclick="itemsTable.unselectAllRows(); itemsTable.selectRow(#{rowIndex}, false)" />
            <h:commandLink onclick="itemsTable.unselectAllRows(); itemsTable.selectRow(#{rowIndex}, false); confirmation.show(); return false;">
                <h:graphicImage library="images" name="edit-delete.png" width="15" height="15" style="border:none" />
            </h:commandLink>
        </h:panelGrid>
    </p:column>
</p:dataTable>

私は JSF 2.0 と Primefaces 3.4.2 を使用しています。

前もって感謝します

4

1 に答える 1

2

この関数を使用して、ページネーターから現在のページを取得できます。

itemsTable.paginator.getCurrentPage()

したがって、この値、#{rowIndex} の値、およびページあたりの最大行数から正しい行インデックスを計算できます。

 <h:commandLink onclick="itemsTable.unselectAllRows(); itemsTable.selectRow(#{rowIndex}-itemsTable.paginator.getCurrentPage()*10)" action="#{dgRefTypePubBean.editSelectedItem()}">
      <h:graphicImage library="images" name="edit-text.png" width="15" height="15" style="border:none" />
 </h:commandLink>

これが助けになることを願っています。

よろしく。

于 2014-04-09T13:32:07.257 に答える