2013-04-16 9 views
5

Sono curioso di sapere come ottenere il numero di riga di un elemento all'interno di <p:dataTable>.Ottieni il numero di riga in p: dataTable dell'elemento dinamico

<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> 

Bean:

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

stampa sempre row1, non importa quale <p:commandLink> viene cliccato. Cosa mi manca?

risposta

3

Per quanto riguarda il problema concreto, l'attributo id di un componente JSF viene valutato durante il tempo di creazione della vista. Tuttavia, lo #{rowIndex} viene impostato solo durante il tempo di rendering della vista. Pertanto, nel momento in cui viene valutato l'attributo id, il numero #{rowIndex} non è mai stato impostato e il valore predefinito è 0. Questo problema ha essenzialmente esattamente gli stessi motivi già risolti e spiegati qui: JSTL in JSF2 Facelets... makes sense? Nota quindi che c'è solo un componente<p:commandLink>, non multiplo. È solo che è stato riutilizzato più volte durante la generazione di HTML (ogni volta con lo stesso ID componente!).

Per risolvere il problema, utilizzare invece id="row". L'ID dinamico non ha senso in questo caso particolare. JSF anteporrà automaticamente l'indice di riga (controlla l'output HTML generato per vederlo). Non sono sicuro del perché esattamente tu, incorrectly thought, hai bisogno di specificare manualmente l'indice delle righe qui, quindi è difficile proporre la soluzione giusta in quanto ci sono possibilità che non ne hai affatto bisogno. Vedere anche How can I pass selected row to commandLink inside dataTable?

Per il caso in cui si davvero bisogno l'indice di riga, ecco come si potrebbe ottenerlo:

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

I UIComponent#getNamingContainer() ritorna il più vicino naming container madre che è nel tuo caso particolare, la tabella dei dati in sé , in flavor o UIData che a sua volta ha quindi la proprietà rowIndex. In alternativa è possibile anche fare in modo, che è un po 'più auto documentazione:

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

La ringrazio molto per i suggerimenti e facile da capire xplaination! Molto apprezzato! – ctekk

+0

Prego. – BalusC

Problemi correlati