【问题标题】:ice:selectBooleanCheckBox within ice:dataTableice:selectBooleanCheckBox 内 ice:dataTable
【发布时间】:2011-06-28 08:15:45
【问题描述】:

为了选择我要删除的数据,我在 dataTable 的每一行中都放了一个 selectbooleanCheckbox,但复选框不会改变状态,即使我选择了该行,它也总是设置为 false(它在数据表)。 这是我的 backingBean:

    public class PermissionCtrl {

    //some attributes
    private UIData datas;
    private List<Permission> permissions;


    private UISelectBoolean checkbox ;

    @EJB
    private PermissionEjbLocal permissionService;


     //getters & setters


    public List<Permission> getSelectedPermissions() {

    Permission selectedRow = new Permission();
    int size = datas.getRowCount();

    List<Permission> selectedPermissions = new ArrayList<Permission>();
    for (int i = 0; i < size; i++) {
        datas.setRowIndex(i);
        System.out.println(i);
        System.out.println(checkbox.isSelected());
        if (checkbox.isSelected()) {

            selectedRow = (Permission) datas.getRowData();
            selectedPermissions.add(selectedRow);

        }

    }
    return selectedPermissions;
}

public String removeAction() {

    List<Permission> selectedPermissions = getSelectedPermissions();
    for (Permission p : selectedPermissions) {

        permissionService.removePermission(p);
    }
    this.permissions =  permissionService.getAllPermissions(); 

    return null;
}
    }

这是我获取数据的数据表:

    <ice:form>
    <ice:dataTable binding="#{permissionCtrl.datas}" value="#{permissionCtrl.permissions}" var="p">
            <ice:column>
                <f:facet name="header">
                    <ice:outputText value="select" />
                </f:facet>
                <ice:selectBooleanCheckbox binding="#{permissionCtrl.checkbox}"  />
            </ice:column>
            <ice:column>
                <f:facet name="header">
                    <ice:outputText value="ID" />
                </f:facet>
                <ice:outputText value="test" />
            </ice:column>
            <ice:column>
                <f:facet name="header">
                    <ice:outputText value="Label" />
                </f:facet>
                <ice:outputText value="#{p.label}" />

            </ice:column>

            <ice:column style="width:150px">
                <f:facet name="header">
                    <ice:outputText value="Url" />
                </f:facet>
                <ice:outputText value="#{p.url}" />

            </ice:column>


            <ice:column style="width:300px">
                <f:facet name="header">
                    <ice:outputText value="Description" />
                </f:facet>
                <ice:outputText value="#{p.description}" />

            </ice:column>
        </ice:dataTable>
    </ice:form>

有没有人遇到过类似的问题?我的代码中有任何错误吗?

【问题讨论】:

    标签: jsf data-binding ejb-3.0 icefaces


    【解决方案1】:

    你所做的是..对于你绑定相同变量的所有对象,所以结果将是最后一个选择项。它会被覆盖,直到所有对象到达。

    解决方案是::

    在 Permission 类中创建一个持久的布尔属性,例如 isSelected

    将值与属性类似

    <ice:selectBooleanCheckbox binding="#{permissionCtrl.checkbox}" value="#{p.selected}"/>
    

    您将在支持 bean 的复选框属性中获得值 true 或 false。

    public List<Permission> getSelectedPermissions() {
    
        Permission selectedRow = new Permission();
        int size = datas.getRowCount();
    
        List<Permission> selectedPermissions = new ArrayList<Permission>();
        for (int i = 0; i < size; i++) {
            datas.setRowIndex(i);
            selectedRow = (Permission) datas.getRowData();
            if (selectedRow.isSelected()) {
                selectedPermissions.add(selectedRow);
            }
        }
        return selectedPermissions;
    }
    

    【讨论】:

    • 得到它并按照您的建议去做,但我仍然将 false 作为权限实体中选择属性的值:
    • 实际上我的 selectedRow.isSelected() 的标准输出为 false,并且在阶段执行期间出现异常。
    • 15:06:24,637 错误 [生命周期] JSF1054:(阶段 ID:RENDER_RESPONSE 6,视图 ID:/permission/permission.jspx)阶段执行期间抛出异常:javax.faces.event.PhaseEvent [ source=com.sun.faces.lifecycle.LifecycleImpl@1bde3f2] 15:06:24,638 错误 [ReceiveSendUpdates] 在localhost:8080/RoleMgtWeb/block/send-receive-updates [/permission/permission.jspx] 上呈现期间发生异常 javax.faces.FacesException: java.lang.NullPointerException在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:128) 引起:java.lang.NullPointerException
    • 大家好,我设法从数据库中删除了选定的权限,实际上 dataTable 和 commandeButton 的形式不同,这就是复选框没有改变其状态的原因。它甚至可以使用复选框绑定。但是我仍然有例外。换句话说,当我点击 removeAction 按钮时,它会删除选定的权限,然后我就有了那个异常。
    【解决方案2】:

    您将所有复选框绑定到支持 bean 中的相同值,因此稍后的空值将覆盖初始设置值。

    保留一个值列表并使用实例变量对其进行寻址。

    【讨论】:

    • 它确实适用于 jsf 组件,我真的不明白为什么它不适用于 icefaces 组件。它不适用于仅一行,这意味着没有其他值可能会覆盖初始设置值。
    猜你喜欢
    • 2013-01-24
    • 2011-04-04
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多