2

我试图在简单的“单击行以选择”表和“第一列表中的多选复选框”之间切换。我在表格外有一个复选框来更改表格的状态。对于简单表(第一列中没有复选框),必须在p:datatable标签中设置 selectionMode;“单一”或“多重”。在这种状态下,一切正常。

如果更改状态以呈现多选列,则单击事件似乎是通过选择行来消耗的。一般来说,当使用这个多选复选框表时,不会设置 selectionMode;因此鼠标事件会改变复选框的状态。

如何“取消设置” selectionMode。以下是不起作用的事情:

  1. table.setSelectionMode(null)- 这会破坏选择(设置为“”也是如此)
  2. table.getAttributes().get("javax.faces.component.UIComponentBase.attributesThatAreSet")然后删除 selectionMode (它不在设置的属性中)。

我的 xhtml 看起来像:

<h:form id="addForm">

    <p:panel toggleable="false" closable="false" widgetVar="remarksPanel"
        id="remarksPanel" style="margin-bottom:5px; overflow:auto;">

        <p:selectBooleanCheckbox value="#{multipleSelectBean.bulkEdit}">
            <p:ajax update="addForm:remarksTable"
                listener="#{multipleSelectBean.editModeChanged}" />
        </p:selectBooleanCheckbox>
        <h:outputText value=" Bulk Edit" />

        <p:dataTable var="remark" id="remarksTable" rowIndexVar="rowNum"
            value="#{multipleSelectBean.remarkList}" rowKey="#{remark.id}"
            selectionMode="multiple"
            selection="#{multipleSelectBean.selectedRemarks}">

            <p:column rendered="#{multipleSelectBean.bulkEdit}"
                selectionMode="multiple" style="width:18px" />              

            <p:column headerText="Remark">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{remark.remark}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText style="width:98%" id="remark"
                            value="#{remark.remark}" />
                    </f:facet>
                </p:cellEditor>

            </p:column>


        </p:dataTable>



    </p:panel>

</h:form>

我的 Bean 看起来像:

package gov.gsa.krichards.sandbox;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.SelectEvent;

@ManagedBean
@SessionScoped
public class MultipleSelectBean implements Serializable {

private static final long serialVersionUID = 1L;
private final static String[] categoryList;
private List<Remark> remarkList = new ArrayList<Remark>();
private Remark[] selectedRemarks = null;
private String words = "Mauris interdum, turpis nec euismod c aliquet fermentum nisl, in tristique arcu tincidunt nec.";
private boolean bulkEdit = false;
private boolean initialized = false;

static {
    categoryList = new String[4];
    categoryList[0] = "Cat5";
    categoryList[1] = "Cat4";
    categoryList[2] = "Cat3-UTP";
    categoryList[3] = "BNC";
}

public MultipleSelectBean() {
    Random r = new Random();
    for (int i = 0; i < 10; i++) {
        String cat = categoryList[r.nextInt(4)];
        int len = words.length();
        int begIndex = r.nextInt(len / 2);
        int endIndex = begIndex + r.nextInt(len - begIndex);
        Remark rem = new Remark(i, cat, words.substring(begIndex, endIndex));
        remarkList.add(rem);
    }
}

public void editModeChanged() {
    System.out.println("changed to " + bulkEdit);
}

public void setBulkEdit(boolean arg) {
    DataTable table = (DataTable) FacesContext.getCurrentInstance()
            .getViewRoot().findComponent("addForm:remarksTable");
    bulkEdit = arg;

    if (bulkEdit) {
        table.setSelectionMode("single");
    } else {
        table.setSelectionMode("multiple");
    }

}

public boolean isBulkEdit() {
    return bulkEdit;
}

public List<Remark> getRemarkList() {
    return remarkList;
}

public void setRemarkList(List<Remark> remarkList) {
    this.remarkList = remarkList;

}

public String[] getCategoryList() {
    return categoryList;
}

public Remark[] getSelectedRemarks() {
    if (selectedRemarks == null || selectedRemarks.length == 0)
        return null;
    return selectedRemarks;
}

public void setSelectedRemarks(Remark[] selectedRemarks) {
    this.selectedRemarks = selectedRemarks;
}

}
4

0 回答 0