2013-09-04 8 views
8

प्राप्त करें मेरे पास एक डाटाटेबल है जो सूची <> पर आधारित विभिन्न इकाइयों को प्रदर्शित करता है। जब मैं संपादन के लिए एक सेल का चयन करता हूं, तो मैं इसे अद्यतन करने के लिए इकाई को किसी भी तरह से प्राप्त करने में सक्षम होना चाहता हूं। बेशक वहाँ event.getRowIndex है, जिसका उपयोग मैं सूची <> के साथ कर सकता हूं, लेकिन यह हमेशा सुविधाजनक नहीं होता है। क्या CellEditEvent से इकाई प्राप्त करने का शायद कोई दूसरा तरीका है?प्राइमफ़ेस डेटाटेबल सेलएडिट इकाई/ऑब्जेक्ट

उत्तर

22

एक तरीका प्रोग्रामेटिक रूप से वर्तमान <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 नहीं रखने के लिए और अतिरिक्त तर्क पारित कर सकते हैं। यह उत्तर अन्यथा स्पष्ट रूप से दिया गया होगा।

+0

वैसे मुझे सेलएडिटइवेंट की ज़रूरत है, किसी भी तरह से सेलएडी भी शामिल करना सबसे सुविधाजनक होगा यदि संभव हो तो एक इकाई के साथ एक तर्क के रूप में tEvent। एक विधि में परिणाम: सार्वजनिक शून्य पर CellEdit (CellEditEvent घटना, इकाई इकाई)। अन्यथा मैं शायद पहले तरीके से जाऊंगा। – ChrisGeo

+1

आप अतिरिक्त तर्क पास नहीं कर सकते हैं। संबंधित: http: // stackoverflow।कॉम/प्रश्न/3 9 0 9 267/अंतर-बीच-क्रिया-और-कार्यसूची/390 9 382 # 390 9 382 तो हाँ, पहला तरीका जाने का तरीका है। यदि आवश्यक हो तो उस बॉयलरप्लेट कोड को उपयोगिता विधि में छिपाएं। या, यदि आप [जेएसएफ यूटिलिटी लाइब्रेरी ओमनीफेसेस] (http://code.google.com/p/omnifaces/) का उपयोग करते हैं, तो बस 'इकाई इकाई = Faces.evaluateExpressionGet ("# {entity}") का उपयोग करें। – BalusC

6

मैं इस समस्या को दो के साथ संघर्ष कर दिया गया है और मैं वर नाम के आधार पसंद नहीं आया तो मैं इस समाधान पाया:

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

ध्यान दें कि इकाई अद्यतन किया जाता है डीबी में सीधे मर्ज किया जा सकता है, यह भी आप अभी भी पुराना मान प्राप्त कर सकते हैं। पीएस: सब कुछ के लिए @ बालुससी धन्यवाद :)

0

मुझे @ user1928596 का जवाब पसंद आया, इसलिए मैंने सेल द्वारा प्रतिनिधित्व किए गए सटीक डेटापॉइंट को प्राप्त करने के लिए थोड़ा सा विस्तार किया और केवल अपडेट किया। यह जोड़े को बैकएंड कोड में डेटाटेबल कॉलम शीर्षक टेक्स्ट जोड़ता है लेकिन मुझे ऐसा करने का बेहतर तरीका नहीं पता है।

परिणाम के बारे में मुझे वास्तव में आश्चर्य हुआ कि जब मैं डेटाटेबल में डेटा संपादित करता हूं, तो बैकिंग बीन में डेटा भी बदल जाता है। मुझे cellEditEvent.getNewValue() की आवश्यकता नहीं है क्योंकि दृश्य में डेटा किसी भी तरह बैकिंग बीन में डेटा से जुड़ा हुआ है। मैंने सोचा कि यह केवल प्रदर्शन था। OnCellEdit() विधि के अंत में लॉग स्टेटमेंट का उद्देश्य ईवेंट ऑब्जेक्ट के लिए पुराने और नए मान दिखाना था, लेकिन यह केवल नया मान दिखाता है।

यहाँ सेल संपादन योग्य datatable:

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

DataTable

यहाँ प्रदर्शन कोड है

संबंधित मुद्दे