【问题标题】:JSF-2 Select/Unselect all the list of checkboxes with single checkboxJSF-2 使用单个复选框选择/取消选择所有复选框列表
【发布时间】:2016-08-24 04:16:39
【问题描述】:

我在 rich:dataTable 中有复选框列表,我想使用标题列中的一个复选框一次选中所有复选框。

<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 Bean 中的代码:

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?

谢谢。

【问题讨论】:

  • selectAllBox 被解雇了吗?您是否尝试渲染整个表格?
  • @EmilSierżęga 是的,它被解雇了,但在复选框列表中没有看到这样的变化。我没有渲染整个表格,而是渲染了复选框列。感谢您的回复!
  • 你必须渲染整个表格。你不能只渲染“一列”。在呈现的 HTML 中没有这样的东西一列,所以你不想呈现几个 &lt;TD&gt; 的 id 像 tableId:_NUMBER_:selectedForWHProcess。阅读这两个主题:stackoverflow.com/questions/6706849/…stackoverflow.com/questions/16043218/…
  • @EmilSierżęga 嘿,谢谢!但是我该怎么做呢?我是JSF的新手。对不起! :)
  • 你为什么不想尝试渲染整个表格?

标签: checkbox richfaces jsf-2.2


【解决方案1】:

首先。 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);
        }
    }
    

【讨论】:

  • 谢谢埃米尔!我真的很感谢你的努力。我没有使用@PostConstruct。但现在它起作用了。我现在唯一的问题是分页时所有选中的框都未选中但行被选中。
  • 很高兴我能提供帮助,但看起来问题已解决,因为您已将答案标记为已接受 :-)
  • 其实我接受了你的回答!我错过了检查我的! :P 再次接受你的回答!谢谢! :)
【解决方案2】:

感谢埃米尔!我解决了。

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

【讨论】:

  • 这不是您问题的答案,而是您希望的答案。
猜你喜欢
  • 2023-04-04
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2015-11-27
相关资源
最近更新 更多