2011-08-30 5 views
5

Ho un dataTable in un jsf, come posso ottenere tutti i valori da quella tabella.DataTable in JSF

Ecco il mio tavolo:

<h:dataTable id="dt1" value="#{Metadata.placeholders}" var="item" binding="#{Metadata.dataTable}" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3" first="0" rows="4" width="40%" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." > 

        <f:facet name="header"> 
         <h:outputText value="Select elements for available placeholder" /> 
        </f:facet> 

        <h:column> 
         <f:facet name="header"> 
          <h:outputText value="Placeholder" /> 
         </f:facet> 
         <h:outputText value="#{item.id}"/> 
        </h:column> 

        <h:column> 
         <f:facet name="header"> 
          <h:outputText value="Element"/> 
         </f:facet> 
         <h:selectOneListbox id="elements" size="1" > 
          <f:selectItems value="#{item.elements}" /> 
         </h:selectOneListbox> 
        </h:column> 

        <h:column> 
         <f:facet name="header"> 
          <h:outputText value="Value"/> 
         </f:facet> 
         <h:inputText></h:inputText> 
        </h:column> 

       </h:dataTable><br> 

Come si può vedere, la seconda e la terza colonna sono ListBox e testo di input felds, in modo da lasciare supporre che la tabella ha 5 righe e all'utente di selezionare un valore di formare il listbox e inserisci un testo nel campo di testo, quindi come posso ottenere quei dati dopo che l'utente ha premuto il pulsante "invia"?

+0

Questo potrebbe aiutare a http://stackoverflow.com/questions/988869/how-can-i-get-values-out-of-a-selectonemenu-inside-a-jsf-datatable – user219882

+0

Sì, ho visto questo post, ma non funziona per me. Lista selectedRowData = (Lista ) getDataTable(). GetRowData() questa pace di codice genera un'eccezione e per quanto vedo metodo getRowData() restituisce un oggetto per una riga selezionata corrente ... – adgfs

+0

E come si implementa il metodo getDataTable()? Dovrebbe restituire DataModel, che puoi ottenere da FacesContext. – user219882

risposta

5

Basta associare il valore discesa per una proprietà dell'elemento iterato.

<h:dataTable value="#{metadata.placeholders}" var="placeholder"> 
    <h:column> 
     <h:selectOneMenu value="#{placeholder.element}"> 
      <f:selectItems value="#{placeholder.elements}" /> 
     </h:selectOneMenu> 
    </h:column> 
</h:dataTable> 
<h:commandButton value="Submit" action="#{metadata.submit}" /> 

(notare che ho fissato il nonsensicial <h:selectOneListbox size="1"> da un <h:selectOneMenu>)

Quando si invia il modulo, JSF sarà solo impostare il valore della proprietà della elementPlaceholder oggetto iterato. Se si intende accedervi singolarmente, eseguire il ciclo su placeholders nel metodo di azione.

public void submit() { 
    for (Placeholder placeholder : placeholders) { 
     System.out.println(placeholder.getElement()); // Look, JSF has already set it. 
    } 
} 
+0

Grazie BalusC, ottimo post! Ora funziona. – adgfs

+0

Prego. – BalusC

+0

@BalusC, giuro che ho imparato di più su JSF qui da te in StackOverlow rispetto a quello che ho dalla documentazione ufficiale. Grazie per aver condiviso/partecipato. – fusion27

2

E 'solo un esempio di codice, ma l'idea dovrebbe essere in là

for (int i = 0; i < getDataTable().getRowCount(); i++) { 
    getDataTable().setRowIndex(i); 
    Object object = getDataTable().getRowData(); 
} 
1

tua casella di riepilogo e la tua inputText non sa dove (e come) per memorizzare i loro valori. Quindi JSF ha solitamente bean e convertitori gestiti e mappa i valori tramite attributo value.

Se non si è sicuri del nome delle proprietà, è possibile ereditare due hashmap per passare i valori. esempio:

< ... value="#{Metadata.placeholderMap[item.id]['age']}" ... >