2012-04-04 76 views
11

我在primefaces中有一個數據表,我想在我添加一行時查看數據表的最後一頁。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; 
    } 

} 

但js函數setTabIndexTT()永遠不會被阿賈克斯的onSuccess叫...

我怎麼也添加一行時,設置我的數據表的最後一頁?

Primefaces版本是3.1.1

回答

11

在託管豆你可以試試這個代碼:

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

+1。我使用了:((DataTable)FacesContext.getCurrentInstance()。getViewRoot()。findComponent(「myForm」)。findComponent(「myDataTable」))。setFirst(0)'每次刷新內容時都會轉到第一頁。 – falsarella 2012-09-27 11:38:09

+0

我可以知道什麼是'ROWS_DATATABLE',表示在這裏?困惑 – 2014-11-24 08:53:29

+0

我想使用primefaces-datatable的綁定屬性可以使代碼更乾淨(沒有硬編碼ID) – 2015-08-11 15:10:55

1

我會做它沒有任何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(){ 
     ... 
    } 
} 
+0

但getFirst()時被調用?只有第一次渲染數據表?如果我用paginator更改頁面,afet getFirst()不會被調用... – 3vi 2012-04-05 12:25:44

+0

您是對的,我監督了這一點。這個解決方案只在你的支持bean是會話作用域(你的例子中就是這種情況)和'addRow'動作創建一個新視圖時才起作用。你可以通過返回當前的viewId而不是將'addRow'定義爲void。 – fischermatte 2012-04-05 13:47:29

+0

對不起,但我不unterstand如何創建一個新的視圖... – 3vi 2012-04-05 14:27:45

0

你可以通過使用綁定來避免代碼中的顯式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); 
} 
} 
+2

綁定使您遇到更多問題,主要是序列化問題:http://stackoverflow.com/questions/8392236/jsf-uicomponent-binding-serializable-and-view-scoped – 2013-07-26 09:16:52

4

如果數據表widgetVar是dataTableWidget然後使用此:

<script type="text/javascript"> 
      $(document).ready(function() { 
       dataTableWidget.paginator.setPage(0); 
      }); 
</script>