Я пытаюсь создать страницу, на которой вы нажимаете кнопку, и она заполняет богатые datatable динамическим числом столбцов (в конечном итоге это будет поиск, но пока я просто пытаюсь получить кнопку для заполнения жестко кодированных данных);Richfaces 3 динамических столбца datatable
Проблема в том, что в первый раз, когда я нажимаю кнопку, страница обновляется, как ожидалось, и появляется дата, но без столбцов или данных. Если я снова нажму кнопку, все будет выглядеть как обычно.
Может ли кто-нибудь сказать мне, что я делаю неправильно, что мне нужно дважды нажать кнопку?
<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
}
Вот запрос боб так область видимости, что столбцы получить сгенерированные в конструкторе.
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;
}
}
Я думаю, это должно сработать, если ваш управляемый bean-компонент имеет Session scope или wide. В противном случае вы можете заставить его работать с помощью аннотации RichFaces '@ KeepAlive' в вашем управляемом компоненте, чтобы продлить жизнь управляемого бобины. –
Боб - это сеанс. – Catfish
@ Catfish, если вы предоставляете свои снимки экрана после каждого события, это помогает понять больше. –