2011-08-30 64 views
5

我有一個jsf中的dataTable,我怎麼能從該表中獲取所有的值。在JSF中的數據表

這裏是我的表:

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

正如你所看到的,第二和第三列的列表框和輸入文本felds,讓我們假設表有5行,用戶選擇一個值形成列表框,並在文本字段中輸入文本,那麼如何在用戶按下「提交」按鈕後獲取該數據?

+0

這可以幫助你http://stackoverflow.com/questions/988869/how-can-i-get-values-out-of-a-selectonemenu-inside-a-jsf-datatable – user219882

+0

是,我看到這篇文章,但它對我不起作用。列表 selectedRowData =(列表)getDataTable()。getRowData() 這個和平的代碼拋出異常,並且據我看到getRowData()方法返回一個當前所選行的對象... – adgfs

+0

你怎麼實現getDataTable()方法?它應該返回DataModel,你可以從FacesContext獲得。 – user219882

回答

5

只需下拉值綁定到當前迭代的項的屬性。

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

(請注意,我用<h:selectOneMenu>固定nonsensicial <h:selectOneListbox size="1">

當您提交表單,JSF將只設置在迭代Placeholder對象的element屬性的值。如果您打算單獨訪問它,只需在操作方法中循環使用placeholders即可。

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

感謝BalusC,偉大的職位!現在它可以工作。 – adgfs

+0

不客氣。 – BalusC

+0

@BalusC,我發誓我在StackOverlow中從你那裏瞭解了更多有關JSF的知識,而不是從官方文檔中學到的知識。感謝分享/參與。 – fusion27

2

這只是一個示例代碼,但這個想法應該在那裏

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

你的列表框和您的inputText不知道在哪裏(以及如何)來存儲它們的值。 所以JSF通常有管理bean和轉換器,並通過值屬性映射值。

如果您不確定屬性的名稱是什麼,您可以繼承兩個hashmaps來傳遞值。 如:

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