在 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 刷新后丢失排序列和顺序

设置 p:dataTable p:列宽

PrimeFaces 3.0 - <p:dataTable> 标题不与使用 scrollable="true" 对齐

Primefaces:从p:dataTable中的行选择中排除列

p:dataTable 中的 SummaryRow 不起作用