2013-04-03 44 views
3

我不知道如何重置primefaces數據表,然後重新加載數據到它。Primefaces datatable重置和重新加載數據

任何想法?

enter image description here

雖然我點擊「老師」或「院領導班子」很快,我送一個AJAX調用,然後我想完全復位的數據表,然後重新裝載數據。

以下是有關兩個面板部分:

#{msgs.typeOfLeaderPunishment} 
<f:ajax event="valueChange" listener="#{detentionForm.updateData()}" execute="typeOfLeader" render="typeOfPunishment studentTable"> 
    <p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}" style="width:400px" panelStyle="width:150px" effect="fade"> 
     <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" /> 
    </p:selectOneMenu> 
</f:ajax> 

這部分涉及到選擇「院領導班子」或「老師」,那麼這將引發Ajax調用更新數據表。

<p:dataTable id="studentTable" var="student" value="#{detentionForm.students}" paginator="true" rows="10" selection="#{detentionForm.studentSelected}" filterDelay="200" filteredValue="#{detentionForm.filteredStudents}" binding="#{detentionForm.studentTable}"> 
     <f:facet name="header"> 
      Students: 
     </f:facet> 
        <p:column id="prefName" headerText="Preferred Name" sortBy="=#{student.prefName}" filterBy="#{student.prefName}" filterMatchMode="contains"> 
         #{student.prefName} 

        </p:column> 
        <p:column id="lastName" headerText="Last Name" sortBy="#{student.lastName}" filterBy="#{student.lastName}" filterMatchMode="contains"> 
         #{student.lastName} 
        </p:column> 
        <p:column id="house" headerText="House" sortBy="#{student.house}"> 
         #{student.house} 
        </p:column> 
        <p:column id="code" headerText="Student Code" sortBy="#{student.studentCode}" > 
         #{student.studentCode} 
        </p:column> 
        <p:column id="gender" headerText="Gender" sortBy="#{student.gender}"> 
         #{student.gender} 
        </p:column> 
        <p:column id="formName" headerText="Form" sortBy="#{student.form}"> 
         #{student.form} 
        </p:column> 
        <p:column id="yearLevel" headerText="Year Level" sortBy="#{student.yearLevel}"> 
         #{student.yearLevel} 
        </p:column> 
       </p:dataTable> 

這部分是數據表。

//ajax method called when user clicks on "House Leadership Team" or "Teacher" int the selectOneMenu tag 
    public void updateData(){ 
     this.findStudents(); 


    } 



    //populates the student list with student codes depending on what ledership was chosen (eg. HouseLeader -> import House students only) 
    private void findStudents() { 
     this.students.removeAll(this.students); 
     int houseID = this.findTeacherHouseID(); 
     PreparedStatement ps; 
     Connection con; 
     String sqlStudentsTeacher = "SELECT a.LastName, a.PrefName, a.Code, a.Gender, b.FormName, b.YearLevel, c.HouseName FROM detentioncentredb.tbl_students a, detentioncentredb.tbl_forms b, detentioncentredb.tbl_houses c WHERE a.Form = b.Id AND a.House = c.Id"; 
     String sqlStudentsHouseLeader = "SELECT a.LastName, a.PrefName, a.Code, a.Gender, b.FormName, b.YearLevel, c.HouseName FROM detentioncentredb.tbl_students a, detentioncentredb.tbl_forms b, detentioncentredb.tbl_houses c WHERE a.Form = b.Id AND a.House = c.Id AND a.House = ?"; 
     ResultSet rs; 
     try { 
      con = ds.getConnection(); 
      if(this.typeOfLeaderSelectedID == 1){ 
       ps = con.prepareStatement(sqlStudentsTeacher); 
      }else{ //typeOfLeaderSelectedID must equal 2. >>>>>>>>>>>Make sure that makeDetention xhtml page has a specific filter and there must be a validator when the user selects a leadership ty.pe 
       ps = con.prepareStatement(sqlStudentsHouseLeader); 
       ps.setInt(1,houseID); 
      } 
      rs = ps.executeQuery(); 
      //Puts a row into a Student object and chucks into the student arraylist 
      while(rs.next()){ 
       Student s = new Student(); 
       s.setForm(rs.getString("FormName")); 
       s.setGender(rs.getString("Gender")); 
       s.setHouse(rs.getString("HouseName")); 
       s.setLastName(rs.getString("LastName")); 
       s.setPrefName(rs.getString("PrefName")); 
       s.setStudentCode(rs.getString("Code")); 
       s.setYearLevel(rs.getString("YearLevel")); 
       this.students.add(s); 
      } 
      rs.close(); 
      ps.close(); 
      con.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 


    private int findTeacherHouseID(){ 
     PreparedStatement ps; 
     Connection con; 
     String sqlTeacherHouseID = "SELECT House FROM detentioncentredb.tbl_teachers WHERE RegNumber = ?"; 
     ResultSet rs; 
     int id = 0; 
     try { 
      con = ds.getConnection(); 
      ps = con.prepareStatement(sqlTeacherHouseID); 
      ps.setInt(1, this.details.getUserName()); 
      rs = ps.executeQuery(); 
      while(rs.next()){ 
       id = rs.getInt("House"); 
      } 
      rs.close(); 
      ps.close(); 
      con.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     return id; 
    } 

這部分是後臺bean的一部分,顯示了調用ajax方法以及該方法是如何完成的。 我不知道該如何放入ajax方法來重置數據庫,然後將數據加載回數據表。

+0

,你能否告訴我們你的jsf頁面的相關部分和bean部分的ajax方法? –

+0

添加了xhtml代碼和一些支持bean代碼。 –

+0

這是幹什麼的** binding =「#{detentionForm.studentTable}」**在你的數據表定義中? –

回答

5

問題是,雖然你正在調用你的託管bean方法,但你並沒有告訴jsf數據表「更新」它的內容。

這應該有助於

<p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}"> 
    <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" /> 
    <p:ajax event="change" update="studentTable" listener="#{detentionForm.updateData()}" /> 
</p:selectOneMenu> 

的重要組成部分,這裏是更新= 「studentTable」它告訴完成Ajax請求後,更新ID studentTable JSF組件。

PS1:這是假設您的selectOneMenu和datatable具有相同的形式;如果不是的話,你應該用正確的路徑替換update =「studentTable」。 PS2:我建議你閱讀一下DAO圖層,這樣你就可以從託管bean中刪除你的findStudents方法。

+0

但我認爲包裹標籤selectOneMenu用於與F:AJAX標籤,有一個屬性'渲染=「StudentTable」'。我嘗試了標籤,現在它沒有響應。 –

+0

更新了Ajax代碼,希望這個作品 –

+0

呀仍然反應遲鈍:( –

0

無論何時您使用ajax更改選擇菜單,您都在調用updateData方法。 嘗試重建您在updateData方法中顯示的列表'學生'。

+0

是的,我正在那樣做。我仍然不知道它爲什麼沒有更新。 –

+0

嘗試調試您的代碼。它是在做你正在試圖用它做什麼? –

+0

是的。基本上在第一它不更新,但只要我把一些過濾輸入,它更新到新的列表(過濾) –

0

我有與primefaces 4 datatable相同的問題。

  1. 我已將j2ee版本從j2ee6更改爲j2ee7。
  2. 我已經改變了GlassFish服務器從3.1.2最終與廣發4
  3. 我已經從2.2改爲JSF版本2.2.4 並沒有什麼變化(還沒有刷新)

感謝MEHUL Kaklotar我創建/編輯/刪除數據庫和我的數據表刷新後重建/調用getList()。

注:通過調用使用PrimeFaces的DataTable的AJAX/jQuery的過濾器()函數<p:commandbutton>

0

我已經成功添加update=":yourform:yourdatatable" remoteCommand:

<p:selectOneMenu id="typeOfLeader" value="#{detentionForm.typeOfLeaderSelectedID}" 
      style="width:400px" panelStyle="width:150px" effect="fade" 
      onchange="typeOfLeaderUpdate();"> 

<f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" /> 
<p:ajax event="change" oncomplete="typeOfLeaderUpdate();"/> 

<p:remoteCommand id="typeOfLeaderRemoteCommandId" name="typeOfLeaderUpdate" 
       actionListener="#{detentionForm.updateData()}" 
       update="studentTable" 
       oncomplete="student.filter();"/>