【问题标题】:Primefaces DataTable cellEditor - Update cell contentPrimefaces DataTable cellEditor - 更新单元格内容
【发布时间】:2017-03-17 14:59:46
【问题描述】:

我创建了一个带有可编辑单元格的数据表(组件<p:cellEditor>), 以primefaces example为参考。

<h:form id="form">
    <p:dataTable id="table" value="#{cars}" var="entity" editable="true" editMode="cell" tableStyle="width:auto">
        <p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" />
        <p:column headerText="Owner">
            <p:cellEditor id="ownerCell">
                <f:facet name="input">
                    <p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
                        <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
                    </p:selectOneMenu>
                </f:facet>
                <f:facet name="output">
                    <h:panelGroup id="ownerOutput"><h:outputText value="#{entity.owner.name}" /></h:panelGroup>
                </f:facet>
            </p:cellEditor>
        </p:column>

我的问题是单元格的更新。我可以更改 selectOneMenu 元素的值,但方面组件输出 (id="ownerOutput") 未更新。我已经检查了只有当构面输入和输出具有相同的属性值时,即

<p:selectOneMenu value="#{entity.owner.name}" style="width:100%">
    <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.name}" />

然后代码工作。但我想使用我的原始代码和 id。 我尝试过但没有成功的其他解决方案:

  1. 解决方案 1:

    <p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" update="table" />
    
  2. 解决方案 2:

    public void onCellEdit(CellEditEvent event) {
    Object newValue = event.getNewValue();
    if(newValue != null) {
        int alteredRow = event.getRowIndex();
        String columnName = event.getColumn().getHeaderText();
        FacesContext context = FacesContext.getCurrentInstance();
        Account entity = context.getApplication().evaluateExpressionGet(context, "#{entity}", Car.class);
        entity = service.findAndLoadEntityWithLazyReferencesById(Car.class, entity.getId());
        if(columnName.equals("Owner") {
            entity.setUsername((String) newValue);
        }
    Owner owner = service.findEntityById(Owner.class, (Long) newValue);
            entity.setOwner(owner);
    try {
            service.createOrUpdateEntity(entity);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    if(columnName.equals("Owner") {
            RequestContext.getCurrentInstance().update("form:table:" + String.valueOf(alteredRow) + ":memberCell");
        }
    

【问题讨论】:

    标签: primefaces datatable cell jsf-2.2


    【解决方案1】:

    您的问题不是组件的update,实际上它们已经更新得很好。 它的submit。 当您选择一个选项时,您的 selectOneMenu 未提交。 你需要在里面放一个ajax。 一个简单的&lt;p:ajax/&gt; 就可以了。

    <p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
        <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
        <p:ajax/>
    </p:selectOneMenu>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2014-09-02
      相关资源
      最近更新 更多