3

ボタンをクリックすると、richfacesデータテーブルに動的な数の列が入力されるページを作成しようとしています(最終的にはルックアップになりますが、今のところ、ハードコードされたデータを入力するためのボタンを取得しようとしています) ;

問題は、ボタンを初めてクリックすると、ページが期待どおりに更新され、データテーブルが表示されますが、列やデータが表示されないことです。ボタンをもう一度クリックすると、すべてが正常に表示されます。

ボタンを2回クリックする必要があるという、私が間違っていることを誰かに教えてもらえますか?

    <a4j:form id="searchForm" style="height: 100%;" ajaxSubmit="false">
    ...
        <h:commandButton value="Search" action="#{tableBacking.search}" />
    ...
        <rich:scrollableDataTable id="resultsTable" value="#{tableBacking.results}" var="results" 
              rows="500" >
           <rich:column>
                <f:facet name="header">
                    <h:outputText value="Row" />
                </f:facet>

                <h:outputText value="#{row}" />
            </rich:column>

            <rich:columns value="#{tableResultsBacking.columns == null ? '' : tableResultsBacking.columns}" var="columns" index="ind" id="column#{ind}" sortBy="#{columns.header}" >
                <f:facet name="header">
                    <h:outputText value="#{columns.header}" />
                </f:facet>

                <h:outputText value="#{results[ind].data}" />
            </rich:columns>

         </rich:scrollableDataTable>
    </a4j:form>

バッキングビーン

public class TableLookupBacking {

    private List<SelectItem> allTables = null;
    private List<List<Column>> results = null;

    public TableLookupBacking() throws Exception {}

    public List<SelectItem> getAllTables() {

        if(allTables == null) {
            allTables = new ArrayList<SelectItem>();
            DataDao dd = new DataDao();
            try {
                allTables = dd.getTableNames();
            } catch (Exception e) {
                // TODO Add error message here
                e.printStackTrace();
            }
        }

        return allTables;
    }

    public void search() {

        DataDao dd = new DataDao();
        try {
            results = dd.getData();
        } catch (Exception e) {
            // TODO Add error message here
            e.printStackTrace();
        }
        columns = new ArrayList<Column>();

        for (List<Column> row : results) {
            for (Column c : row) {
                if(columns.size() < row.size()) {
                    columns.add(new Column(c.getHeader()));
                }
            }
        }

        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("columns", columns);
    }
// getters and setters
}

コンストラクターで列が生成されるように、リクエストスコープのBeanを次に示します。

public class TableResultsBacking {

    private List<TableData> columns = null;

    public TableResultsBacking() throws IOException {
        if(null != FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("columns")) {
            columns = (List<TableData>) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("columns");
        } 
    }

    public List<TableData> getColumns() throws Exception {
        return columns;
    }
    public void setColumns(ArrayList<TableData> columns) {
        this.columns = columns;
    }
}
4

2 に答える 2

2

最初の2回のクリック後、ページが実際に正しく読み込まれないようです。1回の検索ごとに2回のクリックが必要です。どうやら最初の2回のクリックの後、データは次のクリックで正しく表示されますが、以前に検索された列数のみが表示されます。

ドロップダウンで値を選択すると、データベースにクエリを実行して列数を取得し、列を設定するメソッドを追加することになりました。そうすれば、ページが更新されたときに、列はすでに存在します。

于 2013-01-02T02:21:42.850 に答える
1

TableResultsBackingこれはリクエストスコープのBeanであると言いましたが、セッションに入れました。つまり、セッションスコープです。それが、初めて何も表示されない理由です。2番目のリクエストでは、列がセッションに残っているため、最初のリクエストの列を表示します。immediate="true"コマンドボタンに属性を追加してみてください。

于 2012-12-27T17:38:11.077 に答える