В Primefaces 5.0 есть компонент DataGrid. Он показывает входные данные, разделенные по строкам. Как показать данные, разделенные по столбцам?
A B C A D G
D E F --> B E H
G H C F
В Primefaces 5.0 есть компонент DataGrid. Он показывает входные данные, разделенные по строкам. Как показать данные, разделенные по столбцам?
A B C A D G
D E F --> B E H
G H C F
Мое решение для переноса данных в компоненте DataGrid Primefaces состоит в том, чтобы переопределить метод encodeTable()
класса DataGridRenderer
.
@Override
protected void encodeTable(FacesContext context, DataGrid grid) throws IOException {
ResponseWriter writer = context.getResponseWriter();
int columns = grid.getColumns();
int firstRowIndex = grid.getFirst();
int rowIndex = firstRowIndex;
int rows = grid.getRows();
int itemsToRender = rows != 0 ? rows : grid.getRowCount();
int numberOfRowsToRender = (itemsToRender + columns - 1) / columns;
String transpose = (String) grid.getAttributes().get("transpose");
boolean isTranspose = transpose != null ? Boolean.valueOf(transpose) : false;
writer.startElement("table", grid);
writer.writeAttribute("class", DataGrid.TABLE_CLASS, null);
writer.startElement("tbody", null);
for (int i = 0; i < numberOfRowsToRender; i++) {
writer.startElement("tr", null);
writer.writeAttribute("class", DataGrid.TABLE_ROW_CLASS, null);
for (int j = 0; j < columns; j++) {
writer.startElement("td", null);
writer.writeAttribute("class", DataGrid.TABLE_COLUMN_CLASS, null);
if (isTranspose) {
writer.writeAttribute("style", String.format("width: %d%%;", 100 / columns), null);
}
grid.setRowIndex(isTranspose ? numberOfRowsToRender * j + i + firstRowIndex : rowIndex);
if (grid.isRowAvailable()) {
renderChildren(context, grid);
}
rowIndex++;
writer.endElement("td");
}
writer.endElement("tr");
}
grid.setRowIndex(-1); //cleanup
writer.endElement("tbody");
writer.endElement("table");
}
И зарегистрируйте элемент Renderer в faces-config.xml
:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.DataGridRenderer</renderer-type>
<renderer-class>org.primefaces.component.datagrid.TransposableDataGridRenderer</renderer-class>
</renderer>
</render-kit>
Теперь я могу указать атрибут transposable="true"
для тега <p:dataGrid>
. Код также «фиксирует» таблицу стилей, чтобы иметь одинаковое количество столбцов на каждой странице, даже если на последней странице недостаточно данных для охвата всех столбцов.