2016-08-24 9 views
-1

rich : dataTable 안에 체크 박스 목록이 있습니다. 헤더 열의 단일 체크 박스로 모든 체크 박스를 한번에 확인하고 싶습니다. checkallbox 콩에서JSF-2 단일 체크 박스로 모든 체크 박스 선택/선택 해제

<rich:column id="includeInWHMapping" > 
     <f:facet name="header"> 
     <h:selectBooleanCheckbox value="#{checkallbox.selectAll}"> 
      <f:ajax actionListener="#{checkallbox.selectAllBox}" render="selectedForWHProcess" /> 
     </h:selectBooleanCheckbox> 
     </f:facet>   
     <h:selectBooleanCheckbox id="selectedForWHProcess" value="#{checkallbox.checked[data]}">  
     <f:ajax actionListener="#{checkallbox.selectAllRows}"/> 
     </h:selectBooleanCheckbox></rich:column> 

코드 :

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

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; 
} 

public void selectAllBox(ValueChangeEvent e){ 
    boolean newSelectAll = (Boolean) e.getNewValue(); 
    Iterator<StandardStructure> keys = checked.keySet().iterator(); 
    while(keys.hasNext()){ 
     StandardStructure ss = keys.next(); 
     checked.put(ss, newSelectAll); 
    } 
} 

나는 시간을 확인할 때 : 헤더 열 아무것도 selectBooleanCheckBox 발생합니다. 내가 여기서 무엇을 놓치고 있니? "selectAll"속성에 대한 맵도 구현해야합니까?

감사합니다.

+0

'selectAllBox'가 실행되고 전체 테이블을 렌더링하려 했습니까? –

+0

@ EmilSierżęga 그래, 해고됐지만 체크 박스 목록에는 그런 변화가 없다. 나는 테이블 전체를 렌더링하지 않고 체크 박스 컬럼을 렌더링했다. 답장을 보내 주셔서 감사합니다! –

+0

전체 테이블을 렌더링해야합니다. "열"을 렌더링 할 수는 없습니다. 렌더링 된 HTML에는 컬럼이 없으므로'tableId : _NUMBER_ : selectedForWHProcess'와 같은 ID를 가진 여러 개의 ''을 렌더링하지 않아도됩니다. 이 두 항목 (http://stackoverflow.com/questions/6706849/how-to-do-a-column-level-render-in-datatable-in-jsf 및 http://stackoverflow.com/questions/16043218)을 읽어보십시오./refer-to-jsf-dynamic-generated-id-based-iteration-index –

답변

0

우선. f:ajax에는 actionListener이없고 listener입니다. 문서 here을 읽으십시오. 두 번째로 valueChangeListenerh:selectBooleanCheckbox에 사용할 수 있습니다. 셋째, 리스너 내부의 행 상자가 잘못되었습니다. 기본적으로 this topic을 읽어야합니다.

지금, 여기에 동작하는 예제입니다 : 코드와

<h:form> 
    <rich:dataTable value="#{checkallbox.allValues}" var="data" id="dataTable"> 
     <rich:column> 
      <f:facet name="header"> 
       <h:selectBooleanCheckbox value="#{checkallbox.selectAll}" 
        valueChangeListener="#{checkallbox.selectAllBox}"> 
        <f:ajax render="dataTable" /> 
       </h:selectBooleanCheckbox> 
      </f:facet> 
      <h:selectBooleanCheckbox value="#{checkallbox.checked[data]}"> 
       <f:ajax /> 
      </h:selectBooleanCheckbox> 
     </rich:column> 

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

다른 가능한 문제 (당신은 단지 일부를 공유하기 때문에).

  • 내부에서 아약스를 실행 중이므로 데이터 테이블이 형식이어야합니다.
  • 지도의 키가 개체입니다. equals 방법이 좋은지 확인해야합니다. 95 %의 경우 기본값은 그렇지 않습니다. 특히 @Entity 인 경우
  • 지도가 처음에 false로 채워져 있는지 확인해야합니다. 나는 @PostConstruct를 사용

    @PostConstruct 
    protected void performPostConstructAction() { 
        for (StandardStructure s : getAllValues()) { 
         checked.put(s, false); 
        } 
    } 
    
+0

감사합니다. Emil! 당신의 노력에 정말 감사드립니다. @PostConstruct를 사용하지 않았습니다. 하지만 이제는 효과가 있습니다. 지금있는 유일한 문제는 모든 체크 박스가 선택되지 않았지만 행이 선택되어있는 동안입니다. –

+0

기꺼이 도와 드리겠습니다. 답변을 수락 된 것으로 표시 했으므로 문제가 해결 된 것처럼 보입니다 :-) –

+0

사실 저는 답변을 수락했습니다! 나는 나의 것을 체크하는 것을 놓친다! : P 당신의 대답을 다시 받아 들였습니다! 감사! :) –

0

감사 에밀! 나는 그것을 해결했다.

public void selectAllBox(){ 
    if(!selectAll){ 
     for(StandardStructure item : ssTable.getDto()){ 
      checked.put(item, true); 
     } 
    }else{ 
     for(StandardStructure item : ssTable.getDto()){ 
      checked.put(item, false); 
     } 
    } 
} 
+0

이것은 귀하의 질문에 대한 답변이 아니지만 원하는대로 할 수 있습니다. –