primefaces datatable rowedit不更新单元格元素

roe*_*oel 7 datatable jsf listbox primefaces

我有一个带有rowedit的数据表.我的表的一列是一个列表框中的单元格,列表框中的项目是动态检索的(取决于另一个单元格中的值)我使用rowEditInit来设置selectedrow项目.我想更新列表框以检索正确的值.这不起作用.当我做

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="orderitemstable" />
Run Code Online (Sandbox Code Playgroud)

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

但是,当我这样做

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />
Run Code Online (Sandbox Code Playgroud)

然后单击铅笔图标将行置于编辑模式,但不会调用以检索列表框项.我的观点是,它不会触发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>
Run Code Online (Sandbox Code Playgroud)

这是我的java bean代码

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());

}
Run Code Online (Sandbox Code Playgroud)

我正在使用PF3.5

Bal*_*usC 17

它失败,因为update="rmactionenumid"在此构造中相对于表本身,而不是当前表行.

基本上,它正在寻找具有客户端ID的组件,formId:tableId:rmactionenumid而不是例如第二行formId:tableId:1:rmactionenumid.从技术上讲,<p:ajax>应该放在内部<p:column>,但这不适用于rowEditInit事件.

您需要update根据UIData可用作RowEditEvent参数的组件编写自己的客户端ID ,并将组合的客户端ID添加到PartialViewContext#getRenderIds().

因此,删除<p:ajax update>并扩展onUpdate()方法如下:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)