Как отобразить индекс строки в таблице данных JSF - PullRequest
24 голосов
/ 18 ноября 2008

В таблице данных 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>

но это решение сложное и не работает, когда у меня много вложенных таблиц данных на странице.

Есть идеи, как решить эту проблему лучше?

Ответы [ 5 ]

23 голосов
/ 21 июля 2011

Это решение было опубликовано Джейми Уильямсом на CodeRanch . Он говорит, что это работает с Томагавком. Я использую Primefaces, который также поддерживает это.

<t:dataTable rowIndexVar="row" value="#{someBean.value}">  
    <h:column>  
        <h:outputText value="#{row + 1}"/>  
    </h:column>  
</t:dataTable>
16 голосов
/ 18 ноября 2008

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

}

Вложения dataTables, как правило, следует избегать - если вы не будете осторожны (например, сделайте их потомками формы), это может привести к пропуску O (N ^ 2) дочерних элементов таблицы для каждой фазы жизненного цикла в отправить (и в жизненном цикле 6 этапов).


Для чего-то, что является внешним по отношению к модели, вы можете использовать простой счетчик в управляемом компоненте:

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>

Вид:

<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-компонент является областью запроса и привязан к элементу управления только для чтения вне формы. Он не будет работать во вложенной таблице данных, если вы не хотите, чтобы счетчик строк был глобальным для представления. Но тогда я не уверен, что индекс строки должен быть функцией представления.

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

7 голосов
/ 20 июня 2014

В RichFaces есть решение, аналогичное 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>
3 голосов
/ 18 июля 2017

Я просто зависим от списка и позиции var в этом списке:

<h:column>
          <f:facet name="header">#</f:facet>
          #{bean.listValue.indexOf(varObject)+1}
</h:column>
3 голосов
/ 26 апреля 2016

Это сработало от меня

<h:dataTable var="item" value="#{controller.items}">
    <h:column>#{controller.items.indexOf(item)}</h:column>
    <h:column>value</h:column>
</h:dataTable>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...