2013-04-16 18 views
5

我很好奇如何獲取<p:dataTable>中的元素的行號。獲取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

至於你的具體問題,JSF組件的id屬性在視圖構建期間被評估。但是,#{rowIndex}僅在查看渲染時間期間設置。因此,在評估id屬性時,#{rowIndex}未被設置,並且默認爲0。這個問題基本上與已經回答和解釋的理由完全一樣:JSTL in JSF2 Facelets... makes sense?注意因此有只有一個<p:commandLink>組件,而不是多個。它只是在生成HTML期間多次重複使用(每次都使用相同的組件ID!)。

要修復它,只需使用id="row"。在這種特殊情況下,動態ID是沒有意義的。 JSF會自動預先添加行索引(檢查生成的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