在 p:datatable 上设置页面
Posted
技术标签:
【中文标题】在 p:datatable 上设置页面【英文标题】:set page on p:datatable 【发布时间】:2012-04-17 21:42:56 【问题描述】:我在 primefaces 中有一个数据表,我想在其中添加一行时查看数据表的最后一页。
我的 .xhtml 页面是:
<h:form id=...>
...
<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1"/>
...
</h:form>
<h:form id=...>
...
<p:inputText id="txt_description" value="#templateController.templateDescription" label="templateDescription">
<f:validateLength for="txt_name" minimum="1"/>
<p:ajax event="change"
listener="#calculatePageTable.setPageTableTemplate" onsuccess="setTabIndexTT()"/>
</p:inputText>
...
</h:form>
<script type="text/javascript">
function setTabIndexTT()
tbl1.getPaginator().setPage(#calculatePageTable.pageTableTemplate);
</script>
豆子:
@ManagedBean
@SessionScoped
public class CalculatePageTable
private int pageTableTemplate = 0;
private int pageTableField = 0;
public void setPageTableTemplate()
final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
.findComponent("form:templateTable");
pageTableTemplate = d.getPageCount() - 1;
public int getPageTableTemplate()
return pageTableTemplate;
public void setPageTemplateField()
final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
.findComponent("detailsTable:webTemplateUpdateTable");
pageTableField = (d.getPageCount() - 1);
public int getPageTableField()
return pageTableField;
但是onsuccess ajax永远不会调用js函数setTabIndexTT()...
添加行时如何设置数据表的最后一页?
Primefaces 版本是 3.1.1
【问题讨论】:
【参考方案1】:在您的托管 bean 中,您可以尝试以下代码:
public void setPageDataTable()
final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
.findComponent("form:templateTable");
int first = 1;
if (d.getRowCount() % ROWS_DATATABLE == 0)
first = (d.getRowCount() - ROWS_DATATABLE);
else
first = (d.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE;
d.setFirst(first);
添加新行时调用此方法
【讨论】:
+1 表示d.setFirst(first);
。就我而言,我每次刷新内容时都使用:((DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("myForm").findComponent("myDataTable")).setFirst(0)
转到第一页。
我可以知道这里的ROWS_DATATABLE
是什么意思吗??困惑
我想使用 primefaces-datatable 的绑定属性会使上面的代码更干净(没有硬编码的 id)
如何更改数据表页面?此代码仅将最后输入的行放在开头。【参考方案2】:
如果数据表 widgetVar 是 dataTableWidget 然后使用这个:
<script type="text/javascript">
$(document).ready(function ()
dataTableWidget.paginator.setPage(0);
);
</script>
【讨论】:
另见:***.com/a/33413948/1599699PF('dataTableWV').paginator.setPage(PF('dataTableWV').paginator.cfg.pageCount - 1);
RequestContext.getCurrentInstance().execute("PF('dataTableWV').paginator.setPage(PF('dataTableWV').paginator.cfg.pageCount - 1);");
【参考方案3】:
我会在没有任何 JavaScript 的情况下做到这一点。 Primefaces 的数据表有一个first
属性,它是要显示的第一个数据的索引。
<p:dataTable first="#calculatePageTable.first"/>
...
<p:commandButton value="Add a row" action="#calculatePageTable.addRow"/>
还有你的支持bean:
public class CalculatePageTable
private int first = 1;
public int getFirst()
return first;
public void addRow()
// 1. your stuff for adding the row
...
// 2. switch to the row
first = getFirstRowOnLastPage();
private int getFirstRowOnLastPage()
...
【讨论】:
但 getFirst() 何时被调用?只有第一次渲染数据表?如果我使用分页器更改页面,则不会调用 afet getFirst() ... 你说得对,我已经监督过了。此解决方案仅在您的支持 bean 是会话范围(在您的示例中就是这种情况)并且addRow
操作创建一个新视图时才有效。您可以通过返回当前 viewId 而不是将 addRow
定义为 void 来做到这一点。
只需在最后的 addRow 操作中写入 ‘return "myView";’。其中 'myView' 是表格所在的 xhtml 页面的名称。这将指示 jsf 创建一个新视图而不是使用当前视图。
您的解决方案工作正常,但目前不适用于我。我有一个范围为支持 bean 的视图,它具有用于数据表元素的 addRow() 和 arraylist 以及一个范围为计算第一个元素的支持 bean 会话。在第一个支持 bean 中,我使用一个临时变量来创建新行(它通过更多步骤创建,然后保存到一个数据库中),如果我在 addRow() 中返回新视图,我丢失了临时变量......嗯...... .
似乎还有其他方法,但我还不能尝试。有一个客户端选项可以设置当前页面。见here。你必须添加类似 ‛‛【参考方案4】:
您可以通过使用绑定来避免代码中的显式 ID:
xhtml:
<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1" binding="#calculatePageTable.dataTable" />
豆子:
public class CalculatePageTable
private DataTable dataTable;
public DataTable getDataTable()
return dataTable;
public void setDataTable(DataTable dataTable)
this.dataTable = dataTable;
/* See Teg's answer */
public void setPageDataTable()
int first = 1;
if (dataTable.getRowCount() % ROWS_DATATABLE == 0)
first = (dataTable.getRowCount() - ROWS_DATATABLE);
else
first = (dataTable.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE;
dataTable.setFirst(first);
【讨论】:
绑定给你带来更多问题,主要是序列化问题:***.com/questions/8392236/…以上是关于在 p:datatable 上设置页面的主要内容,如果未能解决你的问题,请参考以下文章
<p:dataTable> 中的 sortMode="multiple" 和 lazy="true" 在分页期间清除多排序元数据
p:datatable 在 ajax 刷新后丢失排序列和顺序
PrimeFaces 3.0 - <p:dataTable> 标题不与使用 scrollable="true" 对齐