【发布时间】: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:
<p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" update="table" /> -
解决方案 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