2008-11-18 31 views
20

行索引我想下一次显示此行索引行......这样的:如何显示在JSF的dataTable在JSF数据表

Column A Column B 
1   xxx 
2   yyy 

我以为我可以使用隐式的EL变量像#{rowIndex}但这不起作用。

我找到了一个解决办法是创建数据表绑定和使用,如绑定:

<h:dataTable var="item" value="#{controller.items}" binding="#{controller.dataTable}"> 
    <h:column>#{controller.dataTable.rowIndex}</h:column> 
    <h:column>value</h:column> 
</h:dataTable> 

但这种方法是复杂的,当我有很多数据表嵌套在一个页面中不能很好地工作。

有关如何以更好的方式解决此问题的任何想法?

+0

请参阅[http:// stackoverflow。COM /问题/ 14633008/JSF -2-数据表行索引,而无需-数据模型。这个答案比下面的答案更新 - 也简短而又甜蜜。 – fr13d 2015-10-02 16:12:04

回答

15

现有的解决方案并不会让我感觉不好。只要您引用嵌套表的模型,rowIndex就可以在嵌套表中工作。

<h:dataTable border="1" value="#{nestedDataModel}" var="nested"> 
     <h:column> 
      <h:dataTable border="1" value="#{nested}" var="item"> 
       <h:column> 
        <h:outputText value="#{nested.rowIndex}" /> 
       </h:column> 
       <h:column> 
        <h:outputText value="#{item}" /> 
       </h:column> 
      </h:dataTable> 
     </h:column> 
    </h:dataTable> 

样品型号:

public class NestedDataModel extends DataModel implements Serializable { 

    private List<List<String>> nestedDataModel = populateModel(); 
    private int index; 

    private List<List<String>> populateModel() { 
     List<List<String>> list = new ArrayList<List<String>>(); 
     for(int x=0; x<3; x++) { 
      List<String> nestedTableData = new ArrayList<String>(); 
      for(int y=0; y<3; y++) { 
       nestedTableData.add("Foo x="+x+" y="+y); 
      } 
      list.add(nestedTableData); 
     } 
     return list; 
    } 

    @Override 
    public int getRowCount() { 
     return nestedDataModel.size(); 
    } 

    @Override 
    public Object getRowData() { 
     List<String> list = nestedDataModel.get(index); 
     return new ListDataModel(list); 
    } 

    @Override 
    public int getRowIndex() { 
     return index; 
    } 

    @Override 
    public Object getWrappedData() { 
     return nestedDataModel; 
    } 

    @Override 
    public boolean isRowAvailable() { 
     return index >= 0 && index < nestedDataModel.size(); 
    } 

    @Override 
    public void setRowIndex(int arg0) { 
     index = arg0; 
    } 

    @Override 
    public void setWrappedData(Object arg0) { 
     throw new UnsupportedOperationException(); 
    } 

} 

嵌套数据表一般应避免 - 如果你不小心(如让他们一种形式的孩子),这可能会导致一个O(N^2 )在提交时将生命周期的每个阶段的子表传递给子表(在生命周期中有6个阶段)。

public class RowCounter implements Serializable { 

    private transient int row = 0; 

    public int getRow() { 
     return ++row; 
    } 

} 

配置:

<managed-bean> 
    <managed-bean-name>rowCounter</managed-bean-name> 
    <managed-bean-class>tablerows.RowCounter</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

查看:

<f:view> 
    <h:dataTable border="1" value="#{tableDataBean.tableDataModel}" 
     var="rowBean"> 
     <h:column> 
      <h:outputText value="#{rowCounter.row}" /> 
     </h:column> 
     <h:column> 
      <h:outputText value="#{rowBean}" /> 
     </h:column> 
    </h:dataTable> 
</f:view> 


的东西是模型的外部,你可以在托管bean使用一个简单的计数器

这是可行的,因为豆我它的请求范围和绑定到表单外的只读控件。它不会在嵌套的dataTable中工作,除非您希望行计数器对视图是全局的。但是,我不相信行索引应该是这个观点的一个功能。

对于嵌套的dataTable,最好从行bean提供行索引。如果您决定对数据集进行分页操作,它还可以提供更多控制权。

+2

不错。为什么从JSF数据表中获取行号这很复杂?那些维护JSF的人憎恨所有其他开发者,他们故意试图让它变得困难吗? – 2012-10-11 19:57:47

18

此解决方案由Jamie Williams发布在CodeRanch上。他说它可以和战斧一起工作。我正在使用primefaces,它也支持它。

<t:dataTable rowIndexVar="row" value="#{someBean.value}"> 
    <h:column> 
     <h:outputText value="#{row + 1}"/> 
    </h:column> 
</t:dataTable> 
+3

乌苏拉的评论: “感谢您使用rowIndexVar解决我使用JSF 1.2和MyFaces的 ,它只能无行空格+ 1 ` `” – 2012-02-23 07:16:12

4

在RichFaces的有布伦特的类似的解决方案:

<rich:dataTable value="#{backingBean.list}" var="v" rowKeyVar="index"> 
    <rich:column> 
     <f:facet name="header">Index</f:facet> 
     <h:outputText value="#{index + 1}" /> 
    </rich:column> 
    <rich:column> 
     <f:facet name="header">Name</f:facet> 
     <h:outputText value="#{v.name}" /> 
    </rich:column> 
</rich:dataTable> 
0

这个工作形成了我

<h:dataTable var="item" value="#{controller.items}"> 
    <h:column>#{controller.items.indexOf(item)}</h:column> 
    <h:column>value</h:column> 
</h:dataTable> 
0

我只是取决于列表和VAR的位置这个名单上:

<h:column> 
      <f:facet name="header">#</f:facet> 
      #{bean.listValue.indexOf(varObject)+1} 
</h:column>