2016-08-31 2 views
0

h : selectBooleanCheckBox in rich : dataTabe입니다. 또한 데이터 테이블의 페이지 매김이 있습니다.h : selectBooleanCheckbox가 rich로 선택되었습니다. 페이지 매김을 사용하면 dataTable이 손실됩니다.

문제는 다음 페이지 번호를 클릭하면 데이터 테이블의 첫 번째 페이지에서 선택한 확인란이 사라집니다. 선택되었지만 다음/이전 페이지를 클릭하면 선택이 해제됩니다.

문제에 대한 아이디어가 있으십니까?

다음은 bean에 대한 주석입니다.

<rich:dataTable value="#{bean.ssTable}" var="data" iterationStatusVar="it" id="myDataTable">  
    ... 
    <rich:column id="includeInWHMapping" > 

     <f:facet name="header"> 
      <h:selectBooleanCheckbox value="#{bean.selectAll}" valueChangeListener="#{bean.selectAllCheckBox}"> 
       <f:ajax render="myDataTable" /> 
      </h:selectBooleanCheckbox> 
     </f:facet>  

     <h:selectBooleanCheckbox id="selectedForWHProcess" value="#{bean.checked[data]}">   
      <f:ajax actionListener="#{bean.selectAllRows}" /> 
     </h:selectBooleanCheckbox> 

    </rich:column> 
    ... 
</rich:dataTable> 

콩 코드 :

private Map<StandardStructure, Boolean> checked = new HashMap<StandardStructure, Boolean>(); 
    private boolean selectAll; 

    /* Controller */ 
    public MyController() { 
     super(new DataSetParameters()); 

     logger.info("StandardStructureController created."); 

     Column rowid_col =new Column("rowid", "rowid", "No.", FilterTypes.NUMERIC, true, true, ""); 
     Column fileid_col =new Column("fileid", "fileid", "File ID", FilterTypes.STRING, true, true, ""); 
     Column releasetag_col =new Column("releasetag", "releasetag", "Releasetag ID", FilterTypes.STRING, true, true, ""); 
     Column applicationid_col =new Column("applicationid", "applicationid", "Application ID", FilterTypes.STRING, true, true, ""); 
     Column filename_col =new Column("filename", "filename", "Filename", FilterTypes.STRING, true, true, "ASC"); 
     Column includeInWHMapping_col =new Column("includeInWHMapping", "includeInWHMapping", "Include in WH Mapping?", FilterTypes.NONE, true, true, ""); 

     columns.put("fileid", fileid_col); 
     columns.put("releasetag", releasetag_col); 
     columns.put("applicationid", applicationid_col); 
     columns.put("filename", filename_col); 
     columns.put("includeInWHMapping", includeInWHMapping_col); 

     initialize(); 
     setOrderField("importDate"); 
     setOrder("DESC"); 
     dataSetParameters.setColumns(columns); 
     loadTable(); 
    } 

    /** getter/setter.. */ 
    public boolean isSelectAll() { 
     return selectAll; 
    } 
    public void setSelectAll(boolean selectAll) { 
     this.selectAll = selectAll; 
    } 

    public Map<StandardStructure, Boolean> getChecked() { 
     return checked; 
    } 

    public void setChecked(Map<StandardStructure, Boolean> checked) { 
     this.checked = checked; 
    } 
    /** Load ssTable */ 
    private void loadTable() { 
     try{ 
      ssTable = new StandardStructureDao(dataSetParameters).getAllStandardStructure(); 
     }catch (Exception ex){ 
      System.out.println("Exception in loading table:"+ex); 
     } 
    } 

    /** Get ssTable */ 
    public Collection<StandardStructure> getSsTable(){ 
     return ssTable.getDto(); 
    } 

    /** Pagination */ 
    public void doPaginationChange(ActionEvent event) {   
     super.doPaginationChange(event); 
     loadTable(); 

     /* trying to set the value of list of checkboxes after loading the table */ 
     Iterator<StandardStructure> keys = checked.keySet().iterator(); 
     while(keys.hasNext()){ 
      StandardStructure ss = keys.next(); 
      if(checked.get(ss)){ /* getting checked boxes */ 
       /* Got stuck here. */ 
       /* How do we just set the true (boolean) value only 
       for list of checkboxes though they are in Map?*/ 
       System.out.println("Row id: " + ss.getRowid() + " Checked : " + checked.get(ss));  
      } 
     } 
    } 

    /** Select all the list of checkbox in datatable */ 
    public void selectAllCheckBox(){ 
     for(StandardStructure item : ssTable.getDto()){ 
      if(!selectAll) 
       checked.put(item, true); 
      else 
       checked.put(item, false); 
     } 
    } 

    /** Select row of data in datatable */ 
    public void selectAllRows(ValueChangeEvent e) { 
     boolean newSelectAll = (Boolean) e.getNewValue(); 
     Iterator<StandardStructure> keys = checked.keySet().iterator(); 
     logger.info("Rows selected..." + newSelectAll); 
     while(keys.hasNext()) { 
      StandardStructure ss = keys.next(); 
      checked.put(ss, newSelectAll); 
      System.out.println("File::"+ss.getRowid()+":"+newSelectAll); 
     } 
    } 

많은 감사

@ManagedBean(name = "bean") 
@ViewScoped 

을 명확히하기 위해, 내 Facelets의 아래 빈 코드를 첨부했습니다!

+0

'selectAllRows' 란 무엇이며 왜 SINGLE 행 체크 박스에 표시되어 있습니까? –

+0

@ EmilSierżęga 안녕하세요, 답장을 보내 주셔서 감사합니다. 실제로 "selectAllRows"는 특정 행의 데이터를 선택하기 때문에 무시할 수 있습니다. –

+1

나는 단지 "그들이 선택 되더라도"그것을 매우 의심한다. 테이블의 가치는 무엇입니까? 그것은 목록 또는 게으른로드 된 데이터 모델입니까? xhtml에서는'ssTable.getDto()'루프에'ssTable'을 사용합니다. –

답변

0

코드가 명확하지 않으므로 혼란 스럽기 때문에 현재 페이지에서 모두 선택하여 페이지 매김을하는 방법을 보여주는 최소한의 예를 제공 할 것입니다. 액션 리스너가 없으면 getters와 setter 만 있습니다. 내가 할 수있는 한 간단하다.

먼저 XHTML :

<h:form> 
    <rich:dataTable value="#{bean.valuesOnPage}" var="data" id="dataTable" rows="20"> 
     <rich:column> 
      <f:facet name="header"> 
       <h:selectBooleanCheckbox value="#{bean.selectAll}"> 
        <f:ajax render="dataTable" /> 
       </h:selectBooleanCheckbox> 
      </f:facet> 
      <h:selectBooleanCheckbox value="#{bean.checked[data]}"> 
       <f:ajax /> 
      </h:selectBooleanCheckbox> 
     </rich:column> 

     <!-- other columns --> 
    </rich:dataTable> 
</h:form> 

그런 다음 빈 :

@ManagedBean(name = "bean") 
@ViewScoped 
public class MyBean { 

    // when the view is first loaded this is empty 
    // until someone will click one of checkboxes 
    private Map<Object, Boolean> checked = new HashMap<Object, Boolean>(); 
    private boolean selectAll; 

    private List<Object> valuesOnPage; 
    private int currentPage = -1; 

    MyBean() { 
     setCurrentPage(1); 
    } 

    // no setter 
    public Map<Object, Boolean> getChecked() { 
     return checked; 
    } 

    public int getCurrentPage() { 
     return currentPage; 
    } 

    public boolean getSelectAll() { 
     return selectAll; 
    } 

    // no setter 
    public List<Object> getValuesOnPage() { 
     return valuesOnPage; 
    } 

    private void loadTable() { 
     try { 
      // gets data from data base 
      valuesOnPage = getData(currentPage); 
     } catch (Exception ex) { 
      System.out.println("Exception in loading table:" + ex); 
     } 
    } 

    public void setCurrentPage(int currentPage) { 
     if (this.currentPage != currentPage) { 
      this.currentPage = currentPage; 
      loadTable(); 
      // we don't need it selected, especially if it 
      // was a paged we've never been on 
      selectAll = false; 
     } 
    } 

    public void setSelectAll(boolean selectAll) { 
     this.selectAll = selectAll; 
     for (Object o : valuesOnPage) { 
      checked.put(o, selectAll); 
     } 
    } 
} 

찾는 방법과 데이터가 변경되고이로드 될 때. 단일 행의 확인란에 대한 새로운 조치가 필요하지 않음을 확인하십시오. JSF는 이것을 value="#{bean.checked[data]}"과 함께 처리 할 것입니다.

그리고 다시 한번 : 맵의 키는 객체입니다. equals 메소드가 좋은지 확인해야합니다. 95 %의 경우 기본값은 그렇지 않습니다. 특히 @Entity 인 경우 즉 this topic을 확인하십시오.

+0

에밀 감사합니다. 제가 확인하겠습니다. 윌 당신이 알려 드리겠습니다! :) –

+0

"당신은 equals 메서드가 좋은지 확인해야합니다."라는 의미는 무엇입니까? ? 나는 그것을하지 않았다. 그래,지도에있는 키는 객체이고 그렇다 그들은 엔티티이다. 그건 그렇고 작동합니다. :/어쨌든 당신의 노력에 감사드립니다! :) –

+0

BTW 작동 중입니다. 나는 그것을 검사했다 ;-) 그냥 객체의 ID를 사용한다. –

관련 문제