2011-08-30 55 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']}" ... >