Primefaces数据表单元格编辑下拉列表问题

时间:2015-11-18 12:36:31

标签: java primefaces datatable xhtml tablecelleditor

我启用了cellEdit模式的Primefaces <p:datatable>,意味着单击单元格时,它会更改为编辑模式,当您单击其他位置(onblur)时,单元格将返回输出模式并调用cellEdit ajax事件(如果已更改)。
在数据表可编辑单元格中,我使用<p:selectOneMenu><p:autoComplete>下拉列表。 Primefaces在单元格容器外生成下拉列表的HTML代码,因此每次从下拉列表中选择内容时,单元格都会保存值并退出编辑模式,我需要它保持编辑模式。
我知道这适用于<h:selectOneMenu>,但使用其他元素对我来说不是一个选择 有没有办法让单元格编辑忽略下拉的点击?
或者有没有办法防止onblur事件在下拉打开时触发?

在我的情况下,数据表的列是动态的 我用:
Primefaces 5.3
PrimeFaces扩展4.0.0
Mojarra 2.2.9
Wildfly 8

此问题的基本示例:

XHTML:

<h:form id="form">
<p:dataTable id="cars" var="car" value="#{dtEditView.cars}" editable="true" editMode="cell" widgetVar="cellCars">

    <p:ajax event="cellEdit"  />

    <p:column headerText="Car">
        <p:cellEditor>
            <f:facet name="output"><h:outputText value="#{car.title}" /></f:facet>
            <f:facet name="input"><p:inputText value="#{car.title}" style="width:100%" label="Car"/></f:facet>
        </p:cellEditor>
    </p:column>

    <p:column headerText="Color">
        <p:cellEditor>
            <f:facet name="output"><h:outputText value="#{car.color}" /></f:facet>
            <f:facet name="input">
                <p:selectOneMenu value="#{car.color}"  style="width:100%">
                    <f:selectItem itemLabel="Red" itemValue="Red" />
                    <f:selectItem itemLabel="Blue" itemValue="Blue" />
                    <f:selectItem itemLabel="Green" itemValue="Green" />
                </p:selectOneMenu>
            </f:facet>
        </p:cellEditor>
    </p:column>

</p:dataTable>
</h:form>

支持bean:

@ViewScoped
@Named("dtEditView")
public class TestController implements Serializable {
   List<Car> cars=new ArrayList<Car>();

    @PostConstruct
    public void init(){
        cars.add(new Car("BMW","Red"));
        cars.add(new Car("Alfa Romeo","Green"));
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }
}

汽车对象:

public class Car {
    String title;
    String color;

    Car(String title, String color){
        this.title=title;
        this.color=color;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

0 个答案:

没有答案