gpt4 book ai didi

jsf - 单元格编辑后 Primefaces 更新表

转载 作者:行者123 更新时间:2023-12-04 18:25:50 24 4
gpt4 key购买 nike

我有一个具有单元格编辑功能的数据表,我想通过应用不同的样式类来更新数据表以显示修改后的记录。

这是我的问题:

  • 如果我在 onCellEdit 事件触发时不更新数据表,记录会正确更新,但我看不到已修改行的应用样式类。
  • 如果我在 onCellEdit 事件触发时更新数据表并使用返回键更新值,一切正常,并且我可以看到修改后的行应用的样式类。
  • 如果我在 on-cell 编辑事件触发时更新数据表并使用鼠标点击更新一个值(点击另一行或同一行内的另一个单元格),只有第一个值被正确更新;当尝试更新其他值时,onCellEdit 事件在我可以插入新值之前触发,因此对于所有后续更改,该事件以 newValue=oldValue 触发。

xhtml 页面:

<h:form id="frm_tbl_riv">
<p:dataTable id="tbl_rilevazioni" var="rilevazione"
value="#{rilevazioni.rilevazioni}" widgetVar="tbl_rilevazioni_id"
editable="true" editMode="cell" scrollable="true" scrollHeight="350"
rowKey="#{rilevazione.idRilevazione}" selectionMode="single"
selection="#{rilevazioni.selezionata}">
<p:ajax event="rowSelect"
update=":tView:frm_tbl_riv:popup_rilevazioni" />
<p:ajax event="cellEdit" listener="#{rilevazioni.onCellEdit}"
update=":tView:frm_btn_riv" />
<!-- update=":frm_btn_riv :frm_tbl_riv" -->
<p:ajax event="contextMenu"
listener="#{rilevazioni.onRilevazioneSelezionata}"
update="@this" />

<p:column headerText="#{msg['rilevazione']}" width="130">
<f:facet name="header">
<h:outputText value="#{msg['rilevazione']}" />
</f:facet>
<h:outputText value="#{rilevazione.descRilevazione}" id="descRil" />
</p:column>
<p:column headerText="#{msg['valore']}"
styleClass="#{rilevazioni.isModificata(rilevazione) ? 'modificata' : ''}"
width="30">
<h:outputText value="#{rilevazione.valore}"
rendered="#{!rilevazioni.isModificabile(rilevazione)}" />
<p:cellEditor
rendered="#{rilevazioni.isModificabile(rilevazione)}">
<f:facet name="output">
<h:outputText value="#{rilevazione.valore}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{rilevazione.valore}"
label="#{msg['valore']}">
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>

和托管 bean( View 范围):

@ManagedBean(name = "rilevazioni")
@ViewScoped
public class GestioneRilevazioniBean implements Serializable
{
// ...

public void onCellEdit(CellEditEvent event)
{
FacesContext context = FacesContext.getCurrentInstance();
FacesMessage msg = null;
Object nuovoValore = event.getNewValue();
Object vecchioValore = event.getOldValue();
int i = event.getRowIndex();
RilevazioneGiornaliera r = rilevazioni.get(i);

r.setIdUtente(userBean.getUserId());

if (!nuovoValore.equals(vecchioValore))
{
try
{
RilevazioniService.getInstance().updateRilevazioneGiornaliera(r);
modificate.add(r);
} catch (Throwable ex)
{
// ...
}
}
}

public boolean isModificata(RilevazioneGiornaliera riv)
{
return modificate.contains(riv);
}

public boolean isModificabile(RilevazioneGiornaliera rilevazione)
{
// some logic
return true;
}
}

如果我使用:

update=":frm_btn_riv :frm_tbl_riv"

对于单元格编辑事件,我获得了第 2 点和第 3 点指定的行为。与 @form@parent 相同。

最佳答案

我已经找到了一个解决方案,可以在 onCellEdit 事件触发后将样式类更新到修改后的单元格。

数据表:

<p:ajax event="cellEdit" listener="#{rilevazioni.onCellEdit}"
oncomplete="handleRilevazioniCellEdit(xhr, status, args);" />
// ...
// within the cell editor
<p:inputText id="rilevazioniCellEditInputtext" value="#{rilevazione.valore}"
label="#{msg['valore']}" />

Javascript:

<script>
function handleRilevazioniCellEdit(xhr, status, args)
{
var modelInput = $('#parentId:' + args.rowIndex + '\\:rilevazioniCellEditInputtext');
var cell = modelInput.parent().parent().parent();
cell.addClass('modificata');
}
</script>

托管 bean,在 onCellEdit() 事件结束时:

RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.addCallbackParam("rowIndex", event.getRowIndex());

关于jsf - 单元格编辑后 Primefaces 更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16671276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com