2008-11-18 21 views
20

En una JSF dataTable Quiero mostrar el índice de la fila al lado de las filas ... como:Cómo visualizar el índice de fila de una tabla de datos de JSF

Column A Column B 
1   xxx 
2   yyy 

pensé que podría utilizar una variable de EL implícita como # {rowIndex} pero esto no está funcionando.

Una solución que encontré es crear un enlace para la tabla de datos y el uso de la unión como:

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

pero esta solución es compleja y no funciona bien cuando tengo muchas tablas de datos anidadas en una página .

¿Alguna idea sobre cómo solucionar esto de una mejor manera?

+0

Ver [http: // stackoverflow.com/questions/14633008/jsf-2-datatable-row-index-without-datamodel]. Esta respuesta es más nueva que las de abajo, también es corta y dulce. – fr13d

Respuesta

15

La solución existente no me parece una mala. RowIndex debería funcionar en tablas anidadas siempre que haga referencia al modelo de la tabla anidada. modelo

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

muestra:

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(); 
    } 

} 

tablas de datos de la jerarquización general, debe evitarse - si usted no tiene cuidado (por ejemplo, hacer que los niños de una forma), esto puede conducir a un O (n^2) pasar sobre la mesa los niños para cada fase del ciclo de vida en un envío (y hay 6 fases en el ciclo de vida).


Para algo que es externo al modelo, se puede utilizar un simple contador en un bean gestionado:

public class RowCounter implements Serializable { 

    private transient int row = 0; 

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

} 

Config:

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

Vista:

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

Esto funciona porque el frijol i s request-scope y vinculado a un control de solo lectura fuera de un formulario. No funcionaría en una tabla de datos anidada a menos que quisiera que el contador de filas sea global para la vista. Pero entonces, no estoy convencido de que el índice de fila deba ser una función de la vista.

Para una tabla de datos anidada, sería mejor que proporcionara el índice de fila del bean de fila. Te da más control si decides hacer cosas como paginación sobre conjuntos de datos también.

+2

Agradable. ¿Por qué es tan complicado obtener el número de fila de la tabla de datos JSF? ¿Las personas que mantienen JSF odian a todos los demás desarrolladores y deliberadamente intentan dificultarlo? –

18

Esta solución fue publicada por Jamie Williams en CodeRanch. Él dice que funciona con Tomahawk. Estoy usando Primefaces, que también lo admite.

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

Comentario de Ursula: "Gracias por la solución usando rowIndexVar. Estoy usando JSF 1.2 y misFaces, solo funciona sin espacios en la fila + 1 ' '" –

4

En RichFaces hay una solución similar a Brent:

<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

Esto funcionó conmigo formar

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

que depender simplemente de la lista y la posición de var en esta lista:

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