2016-08-24 75 views
-1

我有rich:dataTable裏面的複選框列表,我想用標題列中的單個複選框同時檢查所有框。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> 

守則checkallbox豆:

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

當我檢查了H:的標題欄沒有selectBooleanCheckBox發生。我在這裏錯過了什麼?我是否也必須爲「selectAll」屬性實現Map?

謝謝。

+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-ids-based-ite-index- –

回答

0

首先。 f:ajax沒有actionListener,它有一個listener。閱讀文檔here。第二件事,你可以在h:selectBooleanCheckbox上使用valueChangeListener,只有在那裏。第三,聽筒裏面的行箱是錯誤的。基本上,它看起來像你需要閱讀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> 

其他與您的代碼可能出現的問題(因爲你已經分享了一部分)。

  • 由於您正在執行ajax,因此數據表需要處於窗體中。
  • 你在地圖上的鍵是對象。你必須確保equals方法是好的。在95%的情況下,默認值不是,特別是如果它們是@Entity
  • 您必須確保地圖在開始時填入false。我用@PostConstruct

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

謝謝埃米爾!我非常感謝你的努力。我沒有使用@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

這不是你的問題的答案,而是你想要的。 –

相關問題