Jsf primefaces数据表行编辑未更新单元格元素

Jsf primefaces数据表行编辑未更新单元格元素,jsf,primefaces,datatable,listbox,Jsf,Primefaces,Datatable,Listbox,我有一个带有rowedit的数据表。 “我的表”的一列是一个包含列表框的单元格,列表框的项目将被动态检索(取决于另一个单元格中的值) 我使用rowEditInit设置selectedrow项。我想更新列表框以检索正确的值。 这是行不通的。 当我这样做的时候 <p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="orderitemstable" /> 然后,当我单击铅笔图标时,我可以看到行

我有一个带有rowedit的数据表。 “我的表”的一列是一个包含列表框的单元格,列表框的项目将被动态检索(取决于另一个单元格中的值) 我使用rowEditInit设置selectedrow项。我想更新列表框以检索正确的值。 这是行不通的。 当我这样做的时候

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="orderitemstable" />

然后,当我单击铅笔图标时,我可以看到行切换到编辑模式并检索列表框项目。但它直接切换回非编辑模式

但当我这么做的时候

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />

然后单击铅笔图标将该行置于编辑模式,但不会调用以检索列表框项目。我的问题是,它不会触发rmactionenumid的更新

有什么想法吗

罗尔

这是我的jsf代码

            <p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />


            <p:column >  
                <p:cellEditor>  
                    <f:facet name="output">  
                        <h:outputText id="rmactionenumidlabel" value="#{orderItem.rmActionRepr}" >
                        </h:outputText>
                    </f:facet>  
                    <f:facet name="input">  
                        <h:selectOneListbox id="rmactionenumid" value="#{orderItem.rmActionEnumId}" size="1" valueChangeListener="#{workOrderDetail.setActionRepr}">
                            <f:selectItems value="#{workOrderDetail.actionItems}"/> 
                            <p:ajax event="change" update="partdiscount,labourdiscount,totalprice,:detail:wodetail:totals" execute="@this"  />                                  
                        </h:selectOneListbox>   

                    </f:facet>  
                </p:cellEditor>  
            </p:column>
<p:column >
<p:rowEditor id="edit"  />                          
                </p:commandLink>

            </p:column>  
        </p:dataTable>


这是我的JavaBean代码

public List<SelectItem> getActionItems() throws MWSException {
    ArrayList<SelectItem> actions = new ArrayList<SelectItem>();
    if (getSelectedOrderItem() != null) {

        ListManager lm = new ListManager(getWA().getMwsProxy());
        MWSGenericMapList items = lm.nativeSearch(getWS().getUser(), HdfWebConstants.NS_VEHICLEPARTACTIONS, 0, 0, 200,
                false, getSelectedOrderItem().getVehiclePartCode());

        for (int i = 0; i < items.size(); i++) {
            actions.add(new SelectItem(items.get(i).get("rmaction_enumid").toString(), items.get(i).get("rmaction")
                    .toString()));
        }

    }
    return actions;
}

public void setSelectedOrderItem(IMWSOrderItem newSelectedOrderItem) throws MWSException {
    this.selectedOrderItem = newSelectedOrderItem;
}

public void onEdit(RowEditEvent event) throws MWSException {

    setSelectedOrderItem((IMWSOrderItem) event.getObject());

}
public List getActionItems()引发MWSException{
ArrayList操作=新建ArrayList();
如果(getSelectedOrderItem()!=null){
ListManager lm=新的ListManager(getWA().getMwsProxy());
MWSGenericMapList items=lm.nativeSearch(getWS().getUser(),HdfWebConstants.NS_车辆部件操作,0,0,200,
false,getSelectedOrderItem().getVehiclePartCode());
对于(int i=0;i

我使用的是PF3.5,我也遇到过同样的问题。您可以执行以下操作:

在update方法下放置一个logger对象(或者您可以简单地编写一个system.out.println)来检查您的方法是否可以从jsf页面访问。如果是的话,写下你的行动


对于我来说,我已经检查了我的方法是否被访问。在我看到之后,我的行记录仍然没有更新。我所做的是在方法下创建所需行的新对象,并通过getter/setter将行值的内容复制到我的新对象。然后我可以更新我的行。这种方法对我很有效。

它失败了,因为
update=“rmactionenumid”
是相对于表本身而不是当前表行的构造

基本上,它是在寻找一个客户端ID为formId:tableId:rmactionenumid
的组件,而不是第二行
formId:tableId:1:rmactionenumid
。从技术上讲,
应该放在
内,但这对于
rowEditInit
事件不起作用

您需要根据
UIData
组件编写自己的
update
客户端ID,该组件作为
RowEditEvent
参数提供,并将编写好的客户端ID添加到

因此,删除
并扩展
onUpdate()
方法,如下所示:

public void onEdit(RowEditEvent event) {
    UIData table = (UIData) event.getComponent();
    String updateClientId = table.getClientId() + ":" + table.getRowIndex() + ":rmactionenumid";
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(updateClientId);

    // ...
}

按照巴卢斯克的回答:

由于您使用的是Primefaces 3.5,您也可以使用其实用程序类ComponentUtils和RequestContext:

String actId = ComponentUtils.findComponentClientId( "rmactionenumid" );
RequestContext.getCurrentInstance().update( actId );

将执行与BalusC发布的代码片段相同的操作

它可能会帮助某人。我有一个类似的问题,我在互联网上尝试了所有可能的事情。最终我放弃了,但后来不小心修好了。问题是我在.xhtml中使用了多个,并且由于某种原因没有传播这些更改。
希望它能帮助别人

天哪,我花了很长时间才弄明白这一点。巴卢斯一如既往地对钱一窍不通,但我没想到的是,更新数据表并没有像我预期的那样更新它的所有子项。更新表实际上会更新行(基础模型中已删除的行消失)并重新排序行(如果基础模型已重新排序),但CellEditor容器中outputText窗口小部件中的值不会更新,编辑的值除外,除非您为要更新的对象提供了
标记,在我的情况下,他们都是。我猜有一个设计假设,当CellEditor启动Ajax调用时,Datatable父级只会更新编辑的子单元格。我一直不明白为什么CellEditor需要同时包含输入文本和输出文本才能工作

当多个用户在不同的会话中同时编辑同一个数据表时,这给我带来了可怕的问题。UserA将进行编辑并获得一个正确更新的表,表中的行可能以不同的顺序排列。然后,Datatable现已过期的UserB将进行编辑,编辑将正确地持久化到数据库(因为该行具有唯一的隐藏ID),但编辑将转到Datatable中的错误行(但却是正确的列),并且UserB即使在更新之后,也不会在其他单元格中看到UserA的更改。一旦我将
标记放入inputText主体中,它就会正常工作。我仍然有并发问题,我必须单独解决,但至少在编辑后Datatable是正确的


巴卢斯克,如果你在那里,请纠正我的错误假设。

你为什么在
selectOneListbox
的同时使用
valuechangelister
p:ajax
?您有很多代码可以发布您的功能,例如,您在