Jsf PrimeFaces DataTable RowEditor正在更新RowEditInit上的单元格元素,但不更新RowEdit或RowEditCancel上的单元格元素

Jsf PrimeFaces DataTable RowEditor正在更新RowEditInit上的单元格元素,但不更新RowEdit或RowEditCancel上的单元格元素,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我有以下xhtml: <h:form> ... <p:dataTable id="table" value="#{BEAN.rows} var="row" > <p:ajax event="rowEdit" listener="#{BEAN.rowEdit}" /> <p:ajax event="rowEditInit" listener="#{BEAN.rowEditInit}" /> <p:ajax event="

我有以下xhtml:

<h:form>
...
<p:dataTable id="table" value="#{BEAN.rows} var="row" >
    <p:ajax event="rowEdit" listener="#{BEAN.rowEdit}" />
    <p:ajax event="rowEditInit" listener="#{BEAN.rowEditInit}" />
    <p:ajax event="rowEditCancel" listener="#{BEAN.rowEditCancel}" />
    ...
    <p:columns id="columnsElement"
        value="#{BEAN.columns} var="column" >
        <f:facet name="header" >
            <h:outputText value="#{column.code}" />
            <p:selectBooleanCheckbox id="selectAll"
                disabled="#{BEAN.rowInEdit}" />
        </f:facet>

        <p:cellEditor>
            <f:facet name="output">
                <p:selectBooleanCheckbox id="cellCheck"
                    disabled="#{BEAN.rowInEdit} />
            </f:facet>
            <f:facet name="input">
                <p:selectBooleanCheckbox id="selectAll"
                disabled="true" />
            </f:facet>
        </p:cellEditor>
    </p:columns>
</p:dataTable> </h:form>

...

我在datatable之外使用
解决了这个问题,如下所示

并将
oncomplete=“updatedataable()”
添加到
rowEdit
rowEditCancel
ajax事件中


这给了我期望的最终结果,但我仍然很好奇为什么我的初始解决方案不起作用,或者是否有更好的解决方案。

请使用XHTML,而不是使用不透明、不可读和不可管理的Java代码。这将更容易维护。您的意思是使用
update=“…”
?我没有使用它,因为无法知道将有多少行/列,所以我需要以这种方式添加用于更新的ID。。。我是根据这个问题的答案得出这个结论的。如果很难阅读,我道歉,在我的实际代码中有注释和JavaDocs,希望能让它更好,但是为了这个问题,我尝试使代码更通用一些,并删除这些注释以节省一些空间。
public void rowEditInit(RowEditEvent event) {
rowInEdit = true;
UIData table = (UIData) event.getComponent();
String tableId = table.getClientId();
updateTableCheckboxes(tableId, table.getRowIndex());     }

public void rowEdit(RowEditEvent event) {
rowInEdit = false;
UIData table = (UIData) event.getComponent();
String tableId = table.getClientId();
updateTableCheckboxes(tableId, table.getRowIndex());    } // same for rowEditCancel

public void updateTableCheckboxes(String tableId, int index) {
int rowNumber = 0;
for (RowData row : rows) {
    int columnNumber = 0;
    for (ColumnData column : columns) {
        if (row != index) {
            String updateCheckboxId = tableId + ":" + rowNumber
                + ":columnsElement:" + columnNumber + ":cellCheck";
            FacesContext.getCurrentInstance()
                .getPartialViewContext().getRenderIds()
                .add(updateCheckboxId);
        }
        columnNumber++;
    }
    rowNumber++;
}

columnNumber = 0;
while (columnNumber < columns.size()) {
    String selectAllCheckboxId = tableId + ":columnsElement:"
        + columnNumber + ":selectAll";
    FacesContext.getCurrentInstance().getPartialViewContext()
        .getRenderIds().add(selectAllCheckboxId);
    columnNumber++;
}}