2011-08-30 22 views
5

I hava a DataTable w jsf, jak mogę uzyskać wszystkie wartości z tej tabeli.DataTable w JSF

Tu jest mój tabeli:

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

Jak widać, druga i trzecia kolumna są ListBox i tekst wejściowy felds, więc niech zakładają, że stół ma 5 wierszy i użytkownikowi wybrać tworzą wartość tym listbox i wprowadź tekst w polu tekstowym, więc jak mogę uzyskać te dane po naciśnięciu przycisku "wyślij"?

+0

To może pomóc http://stackoverflow.com/questions/988869/how-can-i-get-values-out-of-a-selectonemenu-inside-a-jsf-datatable – user219882

+0

Tak, widziałem ten post, ale to nie działa dla mnie. Lista selectedRowData = (lista ) getDataTable(). GetRowData() ten wyjątek wyjątku dla wyjątku pokoju, i jak widzę, metoda getRowData() zwraca obiekt dla bieżącego wybranego wiersza ... – adgfs

+0

A jak zaimplementować metoda getDataTable()? Powinien zwrócić moduł DataModel, który można uzyskać z FacesContext. – user219882

Odpowiedz

5

Wystarczy powiązać wartość rozwijaną do nieruchomości aktualnie powtórzyć elementu.

<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}" /> 

(zauważ, że ustalił nonsensicial <h:selectOneListbox size="1"> przez <h:selectOneMenu>)

Po wysłaniu formularza, JSF będzie po prostu ustawić wartość majątku powtórzyć Placeholder obiektu element. Jeśli chcesz uzyskać do niego dostęp indywidualnie, po prostu przeprowadź pętlę nad placeholders w metodzie akcji.

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

Dzięki BalusC, świetny post! Teraz działa. – adgfs

+0

Nie ma za co. – BalusC

+0

@ BalusC, przysięgam, że dowiedziałem się więcej o JSF od ciebie w StackOverlow, niż mam z oficjalnej dokumentacji. Dziękujemy za udostępnienie/uczestnictwo. – fusion27

2

To tylko przykładowy kod, ale idea powinna być tam

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

Twój Listbox a inputText nie wie, gdzie (i jak) do przechowywania wartości. Tak więc JSF zwykle ma zarządzane-komponenty i konwertery i mapuje wartości za pomocą atrybutu value.

Jeśli nie masz pewności, jaka jest nazwa właściwości, możesz dziedziczyć dwie hashmapy, aby przekazać wartości. np

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