tablas example etiquetas ejemplo consultas columns jsf datatable

jsf - example - primefaces datatable dynamic columns



Cómo mostrar el índice de fila en una tabla de datos JSF (5)

En una tabla de datos JSF, quiero mostrar el índice de filas junto a las filas ... como:

Column A Column B 1 xxx 2 yyy

Pensé que podría usar una variable 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 usar el enlace 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 resolver esto de una mejor manera?


En RichFaces hay una solución similar a la de 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>


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>


Esto funcionó de mí

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


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

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

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

Generalmente, se deben evitar las tablas de datos de anidamiento; si no se tiene cuidado (p. Ej. Hacer que sean hijos de un formulario), esto puede llevar a que O (N ^ 2) pase sobre la tabla hijos 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, puede usar un contador simple en un bean administrado:

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>

Ver:

<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 bean es request-scope y está ligado 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 proporcionar el índice de fila desde el bean de fila. Te da más control si decides hacer cosas como paginación sobre conjuntos de datos también.


Simplemente dependo de la lista y posición de var en esta lista:

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