簡體   English   中英

PrimeFaces DataTable CellEdit獲取實體/對象

[英]PrimeFaces DataTable CellEdit get entity/object

我有一個數據表,它顯示基於List <>的各種實體。 當我選擇一個單元格進行編輯時,我希望能夠以某種方式獲取實體以便更新它。 當然有event.getRowIndex,然后我可以使用List <>,但這並不總是方便的。 是否有另一種方法可以從CellEditEvent獲取實體?

一種方法是以編程方式EL評估當前的<p:dataTable var>

給出一個

<p:dataTable value="#{bean.entities}" var="entity">

你可以得到如下

public void onCellEdit(CellEditEvent event) {
    FacesContext context = FacesContext.getCurrentInstance();
    Entity entity = context.getApplication().evaluateExpressionGet(context, "#{entity}", Entity.class);
    // ...
}

另一種方法是,如果您對CellEditEvent參數不感興趣,則可以通過將當前迭代的實體作為參數傳遞來完全覆蓋CellEditEvent參數:

<p:ajax event="cellEdit" listener="#{bean.onCellEdit(entity)}" />

public void onCellEdit(Entity entity) {
    // ...
}

請注意,您不能保留CellEditEvent並傳遞其他參數。 否則顯然會給出這個答案。

我一直在努力解決這個問題二,我不喜歡依賴var名稱,所以我找到了這個解決方案:

public void onCellEdit(CellEditEvent event) {  
    Entity entity =(Entity)((DataTable)event.getComponent()).getRowData();
}

請注意,實體更新后可以直接合並到DB中,也可以獲得舊值。 PS:謝謝你@BalusC的一切:)

我喜歡@ user1928596的答案,所以我擴展了一下以獲得單元格所代表的精確數據點,並僅更新它。 這會將數據表列標題文本耦合到后端代碼,但我不知道更好的方法。

結果令我感到驚訝的是,當我編輯數據表中的數據時,支持bean中的數據也會發生變化。 我不需要cellEditEvent.getNewValue(),因為視圖中的數據以某種方式綁定到輔助bean中的數據。 我以為它只是顯示器。 onCellEdit()方法末尾的log語句旨在顯示Event對象的舊值和新值,但它僅顯示新值。

這是可單元格編輯的數據表:

數據表

這是顯示代碼:

    <p:dataTable id="facilitatorAdminEvents" var="event" value="#{testBean.facilitatorEvents}" editable="true" editMode="cell">
          <p:ajax event="cellEdit" listener="#{testBean.editEvent}" update="facilitatorAdminEvents" />
        <p:column headerText="Event Name"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.name}"></h:outputText></f:facet><f:facet name="input"><p:inputText value="#{event.name}"  style="width:100%" /></f:facet></p:cellEditor></p:column>
        <p:column headerText="Start Date"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.startdate}"><f:convertDateTime pattern="M/d/yyyy" /></h:outputText>
            </f:facet><f:facet name="input"><p:calendar id="eventStartdate" value="#{event.startdate}" effect="fold" /></f:facet></p:cellEditor>
        </p:column>
        <p:column headerText="End Date"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.enddate}"><f:convertDateTime pattern="M/d/yyyy" /></h:outputText>
            </f:facet><f:facet name="input"><p:calendar id="eventEnddate" value="#{event.enddate}" effect="fold" /></f:facet></p:cellEditor>
        </p:column>
        <p:column headerText="Status"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.status}" /></f:facet>
            <f:facet name="input">
                    <p:selectOneMenu id="eventstatuses" value="#{event.status}" style="width: 100%; margin: auto; " scrollHeight="80" showHeader="false" label="Statuses">
                        <f:selectItems value="#{testBean.eventStatuses}" var="status" itemLabel="#{status}" />
                    </p:selectOneMenu>
            </f:facet></p:cellEditor>
        </p:column>
        <p:column id="delete" style="text-align: center; vertical-align: middle; min-width: 54px; ">
            <p:commandButton update="facilitatorAdminEvents" icon="ui-icon-close" actionListener="#{testBean.deleteEvent(event.id)}"></p:commandButton>
        </p:column>
    </p:dataTable>

和onCellEdit方法(我將其命名為editEvent()):

public void editEvent(CellEditEvent cellEditEvent) {
    Object newValue = cellEditEvent.getNewValue();
    String columnHeader = cellEditEvent.getColumn().getHeaderText();
    Event editedEvent = (Event) ((DataTable) cellEditEvent.getComponent()).getRowData();
    Event eventBeforeEdit = null;
    for (Event thisEvent : events) { // Find this event in the list of cached events.
        if (editedEvent.getId() == thisEvent.getId()) {
            eventBeforeEdit = thisEvent;
        }
    }
    log.info("Updating event " + eventBeforeEdit + " to " + editedEvent);
    SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
    String update = null;
    if ("Event Name".equals(columnHeader)) {
        update = "update events set name = '" + newValue + "' where id = " + editedEvent.getId();
    } else if ("Start Date".equals(columnHeader)) {
        update = "update events set startdate = '" + dateFormatter.format(newValue) + "' where id = " + editedEvent.getId();
    } else if ("End Date".equals(columnHeader)) {
        update = "update events set enddate = '" + dateFormatter.format(newValue) + "' where id = " + editedEvent.getId();
    } else if ("Status".equals(columnHeader)) {
        update = "update events set status = '" + newValue + "' where id = " + editedEvent.getId();
    } else {
        log.error("Unrecognized value " + newValue + " encountered during event edit.");
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Event Save Failure:", "Apologies but we were unable to parse your entry " + newValue);
        FacesContext.getCurrentInstance().addMessage(null, message);
        return;
    }
    try {
        mysqlNamedParameterJdbcTemplate.update(update, new HashMap<String, String>());
    } catch (DuplicateKeyException e) { // There may be an event with the same name.
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Event Save Failure:",
                "That name has already been used for an archived or logically deleted event. " + "Please use a different name for the new event to avoid confusion.");
        FacesContext.getCurrentInstance().addMessage(null, message);
        return;
    }
    log.info("Event " + eventBeforeEdit + " updated to " + editedEvent);
    loadEvents();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM