Как отобразить индекс строки в таблице данных JSF

Вы дважды написали тест конца цикла.

Один раз как положительный внутри цикла (правильно) и один раз как отрицательный в конце цикла.

1) Напишите это только один раз. ("Break" завершит цикл.) То есть замените do {...} while (...) на while (true) {...}

2) Если хотите чтобы написать его дважды, отметьте <2, а не != 2 во втором тесте. Отрицание x> = 2 не есть x! = 2

24
задан Panagiotis Korros 18 November 2008 в 08:07
поделиться

1 ответ

Существующее решение не кажется мне плохим. 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>

Это работает, потому что боб является объемом запроса и связанный с управлением только для чтения вне формы. Это не работало бы во вложенной таблице данных, если Вы не хотели строку в противоречии с быть глобальными к представлению. Но тогда, я не убежден, что индекс строки должен быть функцией представления.

Для вложенной таблицы данных, Вы были бы более обеспеченным обеспечением индекса строки от боба строки. Это дает Вам больше контроля, если Вы решаете сделать вещи как разбиение на страницы по наборам данных также.

16
ответ дан 28 November 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: