2013-02-27 2 views
3

단일 행 선택 및 페이지 매김을 사용하는 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를 사용하고 있습니다. 사전에

감사

답변

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> 

이 도움이 되었기를 바랍니다.

감사합니다.

+0

답장을 보내 주셔서 감사합니다. 사실, 사용자가 페이지 당 줄 수를 선택할 수있는 몇 가지 옵션을 허용하는 rowsPerPageTemplate이 있었기 때문에이 문제를 부분적으로 해결했을 것입니다. 당연히 그 번호를 얻을 수 있다면 (물론 가능하다) 문제가 해결 될 것입니다. 앞으로 다른 사람들에게 도움이되기를 바랍니다. 귀하의 답변을 해결사로 선택하겠습니다.) – H3LL0

관련 문제