2013-04-16 3 views
5

मैं उत्सुक हूं कि <p:dataTable> के अंदर किसी तत्व की पंक्ति संख्या कैसे प्राप्त करें।पी में पंक्ति संख्या प्राप्त करें: डेटा गतिशील तत्व के योग्य

<p:dataTable id="userDataTable" value="#{bean.rows}" rowIndexVar="rowIndex"> 
    <p:column headerText="RowCounter"> 
     <p:commandLink id="row#{rowIndex+1}" actionListener="#{bean.getRows}"> 
      <h:outputText value="Show Row #{rowIndex+1}" /> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

बीन:

public void getRows(ActionEvent ae) {     
    System.out.println(ae.getComponent().getId().toString()); 
} 

हमेशा प्रिंट row1, कोई फर्क नहीं पड़ता जो <p:commandLink> क्लिक किया जाता है। मैं क्या खो रहा हूँ?

उत्तर

3

आपकी ठोस समस्या के रूप में, id किसी जेएसएफ घटक की विशेषता को देखने के समय के दौरान मूल्यांकन किया जाता है। हालांकि, #{rowIndex} केवल दृश्य प्रस्तुत करने के दौरान सेट किया गया है। इस प्रकार, इस समय id विशेषता का मूल्यांकन किया गया है, #{rowIndex} कहीं भी सेट नहीं किया गया है और 0 पर डिफ़ॉल्ट है। यह समस्या अनिवार्य रूप से वही आधार है जैसा पहले से ही उत्तर दिया गया है और समझाया गया है: JSTL in JSF2 Facelets... makes sense? इस प्रकार नोट करें कि केवल एक<p:commandLink> घटक एकाधिक नहीं है। यह सिर्फ इतना है कि इसे HTML उत्पन्न करने के दौरान कई बार पुन: उपयोग किया गया है (हर बार एक ही घटक आईडी के साथ!)।

इसे ठीक करने के लिए, बस इसके बजाय id="row" का उपयोग करें। गतिशील आईडी इस विशेष मामले में कोई समझ नहीं आता है। जेएसएफ पहले ही स्वचालित रूप से पंक्ति सूचकांक को प्रीपेड करेगा (इसे देखने के लिए जेनरेट किए गए HTML आउटपुट की जांच करें)। मुझे यकीन नहीं है कि आप वास्तव में क्यों incorrectly thought है कि आपको मैन्युअल रूप से पंक्ति अनुक्रमणिका निर्दिष्ट करने की आवश्यकता है, इसलिए सही समाधान का प्रस्ताव देना मुश्किल है क्योंकि आपको वास्तव में इसकी आवश्यकता नहीं है। भी How can I pass selected row to commandLink inside dataTable?

देखें मामले के लिए आप वास्तव में पंक्ति सूचकांक की जरूरत है, यहाँ आप इसे कैसे प्राप्त कर सकते हैं:

Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex"); 

UIComponent#getNamingContainer() रिटर्न निकटतम naming container माता पिता जो अपने विशेष मामले डेटा ही तालिका में है , स्वाद या UIData में जो बदले में rowIndex संपत्ति है। आप वैकल्पिक रूप से ऐसा भी कर सकते हैं, जो थोड़ा अधिक स्वयं दस्तावेज़िंग है:

UICommand commandLink = (UICommand) ae.getComponent(); 
UIData dataTable = (UIData) commandLink.getNamingContainer(); 
Integer rowIndex = dataTable.getRowIndex(); 
+0

संकेतों के लिए बहुत बहुत धन्यवाद और xplaination को समझने में आसान! बहुत ही सराहनीय! – ctekk

+0

आपका स्वागत है। – BalusC

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