【发布时间】:2016-09-15 21:12:33
【问题描述】:
我有 primefaces 数据表,我想在单元格编辑时更新特定列或整行。已编辑单元格中的值确定同一行中其他列中的值。
我尝试通过 onCellEdit 方法更新组件但没有成功:
String targetTypeColumn = ((DataTable)event.getSource()).getClientId(FacesContext.getCurrentInstance()) +
":" + event.getRowIndex() + ":editor";
RequestContext.getCurrentInstance().update(targetTypeColumn);
列有单元格编辑器:
<p:column id="tgtType" styleClass="mapDetsTblColTypeTgt" headerText="Target Type">
<p:cellEditor id="editor" rendered="...">
<f:facet name="output">
<h:outputText value="..." />
</f:facet>
<f:facet name="input">
<p:inputText value="..." styleClass="mapDetsTblInput" onselect="this.value=this.value" />
</f:facet>
</p:cellEditor>
<h:outputText value="..." rendered="!..."/>
</p:column>
有什么想法吗?
我不想更新整个数据表,因为这是浪费时间。
编辑:
我试图在单元格编辑期间更新数据表
<p:dataTable id="mapperDetailsTable" styleClass="mapperDetailsTable" widgetVar="mapperDetailsTable"
..... >
<p:ajax event="cellEdit" listener="#{bean.onCellEdit}" update=":mapperDetailsForm:growlMapper mapperDetailsTable"
oncomplete="handleCellEdit(args);" />
......
但没有效果。下一个单元格未更新。我写的对吗?我在编辑单元格中使用自动完成,所以我没有更新属性。
<p:cellEditor rendered="#{guiUtils.isEditable(mapperCtrl, fieldMapping)}">
<f:facet name="output">
<h:outputText value="#{fieldMapping.fieldNameTgt}"/>
</f:facet>
<f:facet name="input">
<p:autoComplete value="#{fieldMapping.fieldNameTgt}" completeMethod="#{mapperCtrl.dmUtils.completeTargetFields}" >
<p:ajax event="itemSelect" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/>
<p:ajax event="change" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/>
</p:autoComplete>
</f:facet>
</p:cellEditor>
编辑2:
我检查并更新了列表中正确元素的值。
当我使用该线程的解决方案时(重新加载数据表):Updating entire <p:dataTable> on complete of <p:ajax event="cellEdit"> 一切都好。那么值是正确更新的,但是如何只刷新行或单元格呢?
编辑 3:
我发现我可以使用命令按钮更新单元格
<p:column>
.....
<p:commandButton value="updateTgtRow" id="updateTgtRow" process="@this" ajax="true" immediate="true" update="outputType inputType"/>
</p:column>
在按钮单元格中单击后更新而不重新加载表。但是如何在单元格编辑后调用单击该按钮?当我添加 oncomplete 时,单元格编辑不起作用。单元格是只读的。有什么想法吗?
<p:ajax event="cellEdit" listener="#{mapperCtrl.onCellEdit}"
process="@this" oncomplete="#(updateTgtRow).click()"/>
【问题讨论】:
-
update="tableId"在cellEdit事件期间的默认行为已经是它只更新当前行。你真的尝试过/调查过吗?相关:stackoverflow.com/questions/19548838(实际上要求反过来) -
@BalusC: 你确定
cellEdit的默认值是更新当前行吗? (没试过,不要用行和单元格编辑) -
值在列表中的正确元素上更新。
-
更新整个表格给我带来了一些问题。当我快速编辑单元格时,我失去了对下一个编辑单元格的关注(称为刷新),并且自动完成元素会发生连线变薄。刷新数据表单元格编辑后,在自动完成单击时调用。它调用刷新数据表并失去焦点:/
标签: jsf primefaces datatable tablecelleditor