2016-08-31 5 views
0

У меня есть список h: selectBooleanCheckBox в rich: dataTabe. Кроме того, для данных есть разбиение на страницы.h: selectBooleanCheckbox выбран в rich: dataTable теряется при использовании Pagination

Проблема заключается в том, что когда я нажимаю номер следующей страницы, выбранные флажки на первой странице данных datatable ушли. Хотя они выбраны, нажатие следующей/предыдущей страницы делает их отмененными.

Есть идеи по поводу проблемы?

Это аннотация для фасоли.

@ManagedBean(name = "bean") 
@ViewScoped 

Чтобы уточнить это, я закрепил Facelets и код боб ниже:

<rich:dataTable value="#{bean.ssTable}" var="data" iterationStatusVar="it" id="myDataTable">  
    ... 
    <rich:column id="includeInWHMapping" > 

     <f:facet name="header"> 
      <h:selectBooleanCheckbox value="#{bean.selectAll}" valueChangeListener="#{bean.selectAllCheckBox}"> 
       <f:ajax render="myDataTable" /> 
      </h:selectBooleanCheckbox> 
     </f:facet>  

     <h:selectBooleanCheckbox id="selectedForWHProcess" value="#{bean.checked[data]}">   
      <f:ajax actionListener="#{bean.selectAllRows}" /> 
     </h:selectBooleanCheckbox> 

    </rich:column> 
    ... 
</rich:dataTable> 

Bean код:

private Map<StandardStructure, Boolean> checked = new HashMap<StandardStructure, Boolean>(); 
    private boolean selectAll; 

    /* Controller */ 
    public MyController() { 
     super(new DataSetParameters()); 

     logger.info("StandardStructureController created."); 

     Column rowid_col =new Column("rowid", "rowid", "No.", FilterTypes.NUMERIC, true, true, ""); 
     Column fileid_col =new Column("fileid", "fileid", "File ID", FilterTypes.STRING, true, true, ""); 
     Column releasetag_col =new Column("releasetag", "releasetag", "Releasetag ID", FilterTypes.STRING, true, true, ""); 
     Column applicationid_col =new Column("applicationid", "applicationid", "Application ID", FilterTypes.STRING, true, true, ""); 
     Column filename_col =new Column("filename", "filename", "Filename", FilterTypes.STRING, true, true, "ASC"); 
     Column includeInWHMapping_col =new Column("includeInWHMapping", "includeInWHMapping", "Include in WH Mapping?", FilterTypes.NONE, true, true, ""); 

     columns.put("fileid", fileid_col); 
     columns.put("releasetag", releasetag_col); 
     columns.put("applicationid", applicationid_col); 
     columns.put("filename", filename_col); 
     columns.put("includeInWHMapping", includeInWHMapping_col); 

     initialize(); 
     setOrderField("importDate"); 
     setOrder("DESC"); 
     dataSetParameters.setColumns(columns); 
     loadTable(); 
    } 

    /** getter/setter.. */ 
    public boolean isSelectAll() { 
     return selectAll; 
    } 
    public void setSelectAll(boolean selectAll) { 
     this.selectAll = selectAll; 
    } 

    public Map<StandardStructure, Boolean> getChecked() { 
     return checked; 
    } 

    public void setChecked(Map<StandardStructure, Boolean> checked) { 
     this.checked = checked; 
    } 
    /** Load ssTable */ 
    private void loadTable() { 
     try{ 
      ssTable = new StandardStructureDao(dataSetParameters).getAllStandardStructure(); 
     }catch (Exception ex){ 
      System.out.println("Exception in loading table:"+ex); 
     } 
    } 

    /** Get ssTable */ 
    public Collection<StandardStructure> getSsTable(){ 
     return ssTable.getDto(); 
    } 

    /** Pagination */ 
    public void doPaginationChange(ActionEvent event) {   
     super.doPaginationChange(event); 
     loadTable(); 

     /* trying to set the value of list of checkboxes after loading the table */ 
     Iterator<StandardStructure> keys = checked.keySet().iterator(); 
     while(keys.hasNext()){ 
      StandardStructure ss = keys.next(); 
      if(checked.get(ss)){ /* getting checked boxes */ 
       /* Got stuck here. */ 
       /* How do we just set the true (boolean) value only 
       for list of checkboxes though they are in Map?*/ 
       System.out.println("Row id: " + ss.getRowid() + " Checked : " + checked.get(ss));  
      } 
     } 
    } 

    /** Select all the list of checkbox in datatable */ 
    public void selectAllCheckBox(){ 
     for(StandardStructure item : ssTable.getDto()){ 
      if(!selectAll) 
       checked.put(item, true); 
      else 
       checked.put(item, false); 
     } 
    } 

    /** Select row of data in datatable */ 
    public void selectAllRows(ValueChangeEvent e) { 
     boolean newSelectAll = (Boolean) e.getNewValue(); 
     Iterator<StandardStructure> keys = checked.keySet().iterator(); 
     logger.info("Rows selected..." + newSelectAll); 
     while(keys.hasNext()) { 
      StandardStructure ss = keys.next(); 
      checked.put(ss, newSelectAll); 
      System.out.println("File::"+ss.getRowid()+":"+newSelectAll); 
     } 
    } 

Большое спасибо!

+0

Что такое 'selectAllRows' и почему у вас есть это в строке SINGLE? –

+0

@ EmilSierżęga Привет, спасибо за ответ. На самом деле вы можете игнорировать «selectAllRows», поскольку он выбирает данные определенной строки. –

+1

Я просто очень сомневаюсь, что «хотя они выбраны». Какова ценность таблицы? Является ли это списком или ленивой загруженной моделью данных? В xhtml вы используете 'ssTable' для цикла' ssTable.getDto() '. –

ответ

0

Поскольку ваш код нечеткий и запутанный, я предоставлю вам минимальный пример того, как разбиение на страницы с выбором всех на текущей странице МОЖЕТ выглядеть. Без слушателей действий, просто геттеры и сеттер. Как можно проще.

Первый XHTML:

<h:form> 
    <rich:dataTable value="#{bean.valuesOnPage}" var="data" id="dataTable" rows="20"> 
     <rich:column> 
      <f:facet name="header"> 
       <h:selectBooleanCheckbox value="#{bean.selectAll}"> 
        <f:ajax render="dataTable" /> 
       </h:selectBooleanCheckbox> 
      </f:facet> 
      <h:selectBooleanCheckbox value="#{bean.checked[data]}"> 
       <f:ajax /> 
      </h:selectBooleanCheckbox> 
     </rich:column> 

     <!-- other columns --> 
    </rich:dataTable> 
</h:form> 

Затем фасоль:

@ManagedBean(name = "bean") 
@ViewScoped 
public class MyBean { 

    // when the view is first loaded this is empty 
    // until someone will click one of checkboxes 
    private Map<Object, Boolean> checked = new HashMap<Object, Boolean>(); 
    private boolean selectAll; 

    private List<Object> valuesOnPage; 
    private int currentPage = -1; 

    MyBean() { 
     setCurrentPage(1); 
    } 

    // no setter 
    public Map<Object, Boolean> getChecked() { 
     return checked; 
    } 

    public int getCurrentPage() { 
     return currentPage; 
    } 

    public boolean getSelectAll() { 
     return selectAll; 
    } 

    // no setter 
    public List<Object> getValuesOnPage() { 
     return valuesOnPage; 
    } 

    private void loadTable() { 
     try { 
      // gets data from data base 
      valuesOnPage = getData(currentPage); 
     } catch (Exception ex) { 
      System.out.println("Exception in loading table:" + ex); 
     } 
    } 

    public void setCurrentPage(int currentPage) { 
     if (this.currentPage != currentPage) { 
      this.currentPage = currentPage; 
      loadTable(); 
      // we don't need it selected, especially if it 
      // was a paged we've never been on 
      selectAll = false; 
     } 
    } 

    public void setSelectAll(boolean selectAll) { 
     this.selectAll = selectAll; 
     for (Object o : valuesOnPage) { 
      checked.put(o, selectAll); 
     } 
    } 
} 

Посмотрите, как и когда данные изменения, и когда он будет загружен. Проверьте, что нет никаких необязательных новых действий для флажка одной строки. JSF позаботится об этом с: value="#{bean.checked[data]}".

И еще раз: ваши ключи на карте являются объектами. Вы должны убедиться, что метод equals хорош. В 95% случаев по умолчанию нет, особенно если они @Entity. Проверьте, например, this topic.

+0

Спасибо Эмиль. Я это проверю. Дам вам знать! :) –

+0

Что вы подразумеваете под «Вы должны убедиться, что метод equals хорош». ? Я не понял. Да. Ключи на карте - объект, и да, они - Сущность. Кстати, он работает. :/Спасибо за ваши усилия! :) –

+0

BTW работает. Я проверил его ;-) Просто используйте идентификаторы объектов на карте, а не объекты. –

Смежные вопросы