25

JSF dataTableで、行の横に行インデックスを表示したい...次のようになります。

Column A    Column B
1           xxx
2           yyy

#{rowIndex}のような暗黙のel変数を使用できると思いましたが、これは機能していません。

私が見つけた解決策は、データテーブルのバインディングを作成し、次のようなバインディングを使用することです。

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

しかし、このソリューションは複雑で、ページにネストされたdataTableが多数ある場合はうまく機能しません。

これをより良い方法で解決する方法についてのアイデアはありますか?

4

6 に答える 6

27

このソリューションは、JamieWilliamsによってCodeRanchに投稿されました。彼はそれがトマホークで動作すると言います。私はprimefacesを使用していますが、これもサポートしています。

<t:dataTable rowIndexVar="row" value="#{someBean.value}">  
    <h:column>  
        <h:outputText value="#{row + 1}"/>  
    </h:column>  
</t:dataTable>
于 2011-07-21T12:55:41.590 に答える
17

既存の解決策は私を悪いものとは思わない。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つのフェーズがあります)。


モデルの外部にあるものについては、マネージドBeanで単純なカウンターを使用できます。

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>

Beanはリクエストスコープであり、フォームの外部の読み取り専用コントロールにバインドされているため、これは機能します。行カウンターをビューに対してグローバルにする必要がない限り、ネストされたdataTableでは機能しません。しかし、その場合、行インデックスがビューの関数である必要があるとは確信していません。

ネストされたdataTableの場合、行Beanから行インデックスを提供することをお勧めします。データセットのページネーションなどを行う場合にも、より詳細に制御できます。

于 2008-11-18T12:35:29.890 に答える
7

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>
于 2014-06-20T11:28:32.803 に答える
4

これは私から働きました

<h:dataTable var="item" value="#{controller.items}">
    <h:column>#{controller.items.indexOf(item)}</h:column>
    <h:column>value</h:column>
</h:dataTable>
于 2016-04-26T12:27:44.510 に答える
3

私は単にリストとこのリスト上の var の位置に依存しています:

<h:column>
          <f:facet name="header">#</f:facet>
          #{bean.listValue.indexOf(varObject)+1}
</h:column>
于 2017-07-18T12:48:40.663 に答える