단일 행 선택 및 페이지 매김을 사용하는 primefaces 데이터 테이블을 사용하고 있습니다. 각 행에 대해 사용자가 그 행 (예 : 삭제, 편집)에서 작업을 수행하기 위해 클릭하도록하는 일부 명령 링크 (하나는 비활성화 됨)가 있습니다. 사용자가 오른쪽 행의 단추를 클릭했다는 시각적 인 확인을 제공하기 위해 클릭 할 때 행을 선택하고 원하는 bean 방법으로 진행합니다. 테이블에 페이지가 하나만 있거나 페이지가 1 인 경우 의도 한대로 작동합니다. 다른 모든 페이지에서는 NullPointerException이 발생합니다.
왜 이런 일이 발생하는지 알아 냈습니다. 선택을 수행하기 위해 rowIndexVar를 사용하지만 전체 테이블과 관련된 인덱스를 반환하는 것으로 보이며 selectRow 메서드는 현재 페이지와 관련된 인덱스를 필요로합니다. 페이지 당 10 개의 행이 있고 두 번째 페이지의 세 번째 행을 클릭하면 반환되는 인덱스는 "2"가 아니며 selectRow (12, false)는 null을 반환합니다. 페이지.페이지 매김을 사용하는 primefaces dataTable rowIndexVar
내 질문 : 모든 페이지에서 올바른 선택을 얻으려면 어떻게 올바른 rowIndex를 전달할 수 있습니까?
백킹 빈은 ViewScoped이며, 방법은 특별한 아무것도하지 않습니다 있지만 웹 서비스 및 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를 사용하고 있습니다. 사전에
감사
답장을 보내 주셔서 감사합니다. 사실, 사용자가 페이지 당 줄 수를 선택할 수있는 몇 가지 옵션을 허용하는 rowsPerPageTemplate이 있었기 때문에이 문제를 부분적으로 해결했을 것입니다. 당연히 그 번호를 얻을 수 있다면 (물론 가능하다) 문제가 해결 될 것입니다. 앞으로 다른 사람들에게 도움이되기를 바랍니다. 귀하의 답변을 해결사로 선택하겠습니다.) – H3LL0