2014-12-09 52 views
0

我遇到了在按鈕單擊時按列禁用RichFaces排序的問題。 也許有人可以幫助RichFaces extendedDataTable禁用排序

我有AlertsList數據表:

<rich:extendedDataTable id="#{module}AlertsList" 
          tableState="#{alertsController.dataModel.tableState}" 
          enableContextMenu="false" 
          height="220px" 
          sortMode="single" 
          value="#{alertsController.dataModel}" 
          var="alert" width="100%" 
          selection="#{alertsController.selection}" 
          reRender="#{module}AlertsListDatascroller" 
          rows="#{alertsController.dataModel.rowsPerPage}" 
          binding="#{alertsController.dataModel.extandetDataTable}" 
          rowClasses="evenRow,oddRow"> 
     ......     
     <rich:column sortBy="#{alert.lockedByUsername}" width="7%" 
        style="#{(not empty alert.first4OfLockedByUsername and (alertsController.dataModel.selectedItem != alert)) ? 'background-color: darkgray' : ((alert.action != null and alert.action.classificationTypeEntity.classificationType eq 'POSTPONED') ? 'background-color: thistle' : '')}" 
        label="#{message['alertsnalysis.alertList.table.lock']}" 
        selfSorted="#{currentUser.authorities['SVWI_MODIFICATION']}" 
        id="#{module}AL_lockedByUsername"> 
      <f:facet name="header">#{message['alertsnalysis.alertList.table.lock']}</f:facet> 
      <h:outputText value="#{alert.first4OfLockedByUsername}" /> 
     </rich:column> 
     ...... 
     <rich:column sortBy="#{alert.id}" width="5%" 
        style="#{(not empty alert.first4OfLockedByUsername and (alertsController.dataModel.selectedItem != alert)) ? 'background-color: darkgray' : ((alert.action != null and alert.action.classificationTypeEntity.classificationType eq 'POSTPONED') ? 'background-color: thistle' : '')}" 
        label="#{message['alertsnalysis.alertList.table.id']}" 
        selfSorted="#{currentUser.authorities['SVWI_MODIFICATION']}" 
        id="#{module}AL_id"> 
      <f:facet name="header">#{message['alertsnalysis.alertList.table.id']}</f:facet> 
      <h:outputText value="#{alert.id}" /> 
     </rich:column> 
     .... 
     <rich:datascroller id="#{module}AlertsListDatascroller" for="#{module}AlertsList" ajaxSingle="false" page="#{alertsController.dataModel.currentPage}"></rich:datascroller> 

所以我添加的按鈕來改變在時間soring 3列的表的結果,原因是由於我目前的實現,我不能點擊排序數據在不同的列標題(與sortMode方式= 「乘」 不被接受):

<h:form id="buttonReset">   
     <h:panelGrid columns="2"> 
      <a4j:commandButton id="resetSortingButton" styleClass="FatButtonStyle" reRender="#{module}AlertsList" 
           action="#{alertsController.dataModel.defaultSortField}" value="Default Sorting"/> 
     </h:panelGrid> 



    </h:form> 

另外我有可修改的implementaion:

public abstract class TableDataModel<T, U> extends SerializableDataModel implements Modifiable, Serializable { 
    ... 
    protected String sortField = null; 
    .. 
    public void defaultSortField(){ // call on button "Default Sorting" click action 
     this.sortField = "default"; //set field to default 
     this.detached = false; 
     this.defaultFlag = true; 
     this.i = 0; 
    } 
    ... 
    @Override 
    public void walk(final FacesContext context, final DataVisitor visitor, final Range range, final Object argument) 
      throws IOException { 
     final int firstRow = ((SequenceRange) range).getFirstRow(); 
     final int numberOfRows = ((SequenceRange) range).getRows(); 
     if (detached) { 
      for (final U key : wrappedKeys) { 
       setRowKey(key); 
       visitor.process(context, key, argument); 
      } 
     } else { 
      List<T> list = Collections.<T>emptyList(); 
      if (rangeChanged((SequenceRange) range) || sortChanged(sortField) || filterMapChanged(filterMap) || descChanged(descending) || ((MethodReRendering) this).getReRenderingEnabled()) { 
       lastRange = (SequenceRange) range; 
       lastSortField = sortField; 
       lastFilterMap = new HashMap<String, Object>(filterMap); 
       lastDescending = descending; 
       ((MethodReRendering) this).setReRenderingEnabled(false); 
       list = findObjects(firstRow, numberOfRows, sortField, filterMap, descending); //in findObjects() checking if sortField == "default", then sorting by 3 columns, else by column in field value 
       wrappedKeys = new CopyOnWriteArrayList<U>(); 
       for (final T object : list) { 
        wrappedKeys.add(getId(object)); 
        wrappedData.put(getId(object), object); 
        visitor.process(context, getId(object), argument); 
       } 
      } else { 
       for (U id :wrappedKeys) 
        visitor.process(context, id, argument); 
      } 
     } 
    } 
    ... 

    public void modify(List<FilterField> filterFields, List<SortField2> sortFields) { 
     filterMap.clear(); 
     SortField2 sortField2 = null; 

     String expressionStr = null; 
     ExtendedFilterField extendedFilterField = null; 
     String value = null; 
     Expression expression = null; 
     if (sortFields != null && !sortFields.isEmpty()) { 
      sortField2 = sortFields.get(0); 
      expression = sortField2.getExpression(); 
      ...... 
    } 
    ... 
} 

所以問題是,當我點擊我的幹訓我改變的SortField值和walk()方法返回新3點中的數據,以我的表(見findObjects(FIRSTROW,numberOfRows,的SortField,filterMap,降序);)進行分類。 所有工作正常。

但是在我的頁面上我仍然可以看到(通過圖標或者如果我刷新頁面,它調用與list sortFields參數==「alertId」的modify()方法),這意味着仍然按alertId列排序的數據,實現。我需要什麼邏輯添加到我的defaultSortField()方法(調用「Default Sorting」按鈕單擊),以禁用通過alertId列進行排序? enter image description here

UPDATE1: 新增結合我extendedDataTable財產: 但也許有人知道我可以禁用當前排序? UIExtendedDataTable extandetDataTable = null;

public void setExtandetDataTable(UIExtendedDataTable extandetDataTable) { 
     this.extandetDataTable = extandetDataTable; 
     List<SortField2> sortField2s = extandetDataTable.getSortFields(); 
     SortField2 sortField2; 
    } 

    public UIExtendedDataTable getExtandetDataTable() { 
     return extandetDataTable; 
    } 

回答

0

爲什麼不能使用sortMode=multi

該表還具有sortPriority - IDS通過排序名單,我認爲,這樣會將它通過是那裏的編號的順序排列你不加入列的ID給sortPriority。處理在org.richfaces.renderkit.SortingFilteringRowsRenderer.decodeSorting()完成。

編輯:如果你想禁用排序,你可以在rich:column上設置sortType="custom",但是我不知道這是否會影響你的實現。

+0

如何通過btn點擊來添加新的id到sortPriority?(可能來自我的支持bean)。參見UPDATE1,請見。 – MeetJoeBlack 2014-12-09 13:46:13

+0

Thx,但如何在「默認排序」按鈕點擊後將sortType =「custom」屬性添加到rich:列? – MeetJoeBlack 2014-12-10 06:57:53

+0

您不會在添加它之後將它放在頁面上。 – Makhiel 2014-12-10 09:09:47