2015-02-05 8 views
11

Ich muss sortBy für DataTable programmgesteuert von Bean festlegen. DataTable hat einen einzigen Sortiermodus, statische Spalten und ein benutzerdefiniertes Lazy-Modell zum Sortieren nach benutzerdefinierten Ausdrücken wie = "# {contractor.companyName-MULTY_LANG}". Ich habe viele Möglichkeiten versucht, dies zu tun, und nur eine Möglichkeit funktioniert (Code unten), funktioniert aber nicht richtig - Komponente zeigte ohne hervorgehobenes Feld. Kann jemand antworten, wie man sortBy für DataTable programmatisch setzt?Kann nicht initiale Sortierreihenfolge für DataTable programmgesteuert festlegen

@PostConstruct 
    public void init() {  
     final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent(TABLE_COMPONENT_KEY); 
     String tableSortByExpression = "#{contractor.companyName-MULTY_LANG}"; // expression from some column 
     SortMeta sm1 = new SortMeta(); 
     for (UIComponent child : d.getChildren()) { 
      Column column = (Column)child; 
      ValueExpression columnSortByVe = column.getValueExpression("sortBy"); 
      if (columnSortByVe != null) { 
       String columnSortByExpression = columnSortByVe.getExpressionString(); 
       if (tableSortByExpression != null && tableSortByExpression.equals(columnSortByExpression)) { 
        d.setSortColumn(column); 
        d.setSortOrder("ASCENDING"); 
        break; 
       } 
      } 
     } 
    } 

Ich bin dankbar für jede Hilfe.


Grundflächen 5.1. Tomcat 7. Mojarra 2.2.8

+0

Können Sie es nicht aus der DB in der bevorzugten Standardreihenfolge lesen? Es wird nicht die Spalte markieren, aber ich denke, es funktioniert gut und intuitiv –

+0

Ich bin derzeit mit dem gleichen Problem konfrontiert. Hast du es gelöst? (oder jemand weiß es?) –

+1

Versuchen Sie PF 6.1 zuerst (und Sie müssen es eigentlich programmatisch getan werden? Kannst du xhtml nicht verwenden? – Kukeltje

Antwort

2

allererst org.primefaces.component.datatable.feature.SortFeature erweitern

public class CustomSortFeature extends SortFeature { 
    @SuppressWarnings("rawtypes") 
    @Override 
    public void encode(FacesContext context, DataTableRenderer renderer, DataTable table) throws IOException { 
     table.setFirst(0); 

     if(table.isLazy()) { 
      table.loadLazyData(); 
      singleSort(context, table); 
     } 
     else { 
      if(table.isMultiSort()) 
       multiSort(context, table); 
      else 
       singleSort(context, table); 

      if(table.isPaginator()) { 
       RequestContext requestContext = RequestContext.getCurrentInstance(); 

       if(requestContext != null) { 
        requestContext.addCallbackParam("totalRecords", table.getRowCount()); 
       } 
      } 

      //save state 
      Object filteredValue = table.getFilteredValue(); 
      if(!table.isLazy() && table.isFilteringEnabled() && filteredValue != null) { 
       table.updateFilteredValue(context, (List) filteredValue); 
      } 
     } 

     renderer.encodeTbody(context, table, true); 
    } 
} 

Dann org.primefaces.component.datatable.DataTableRenderer

@FacesRenderer(componentFamily = "org.primefaces.component", rendererType = "org.primefaces.component.DataTableRenderer") 
public class CustomDataTableRenderer extends DataTableRenderer { 
    public List<DataTableFeatureKey> FEATURE = new ArrayList<DataTableFeatureKey>(){/** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

    { 
     add(DataTableFeatureKey.DRAGGABLE_COLUMNS); 
     add(DataTableFeatureKey.FILTER); 
     add(DataTableFeatureKey.PAGE); 
     add(DataTableFeatureKey.SORT); 
     add(DataTableFeatureKey.RESIZABLE_COLUMNS); 
     add(DataTableFeatureKey.SELECT); 
     add(DataTableFeatureKey.ROW_EDIT); 
     add(DataTableFeatureKey.CELL_EDIT); 
     add(DataTableFeatureKey.ROW_EXPAND); 
     add(DataTableFeatureKey.SCROLL); 
     add(DataTableFeatureKey.DRAGGABLE_ROWS); 
    }}; 
    @Override 
    protected void preRender(FacesContext context, DataTable table){ 
     table.setCaseSensitiveSort(false); 
     if(table.isLazy()) { 
      if(table.isLiveScroll()) 
       table.loadLazyScrollData(0, table.getScrollRows()); 
      else 
       table.loadLazyData(); 
     } 

     boolean defaultSorted = (table.getValueExpression("sortBy") != null || table.getSortBy() != null); 
     if(defaultSorted && !table.isLazy()) { 
      table.setDefaultSortByVE(table.getValueExpression("sortBy")); 
      table.setDefaultSortOrder(table.getSortOrder()); 
      table.setDefaultSortFunction(table.getSortFunction()); 

      CustomSortFeature sortFeature = (CustomSortFeature) table.getFeature(DataTableFeatureKey.SORT); 

      if(table.isMultiSort()) 
       sortFeature.multiSort(context, table); 
      else 
       sortFeature.singleSort(context, table); 

      table.setRowIndex(-1); 
     } 

     if(table.isPaginator()) { 
      table.calculateFirst(); 
     } 

     Columns dynamicCols = table.getDynamicColumns(); 
     if(dynamicCols != null) { 
      dynamicCols.setRowIndex(-1); 
     } 
    } 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException{ 
     DataTable table = (DataTable) component; 
     if(table.shouldEncodeFeature(context)) { 
      for(Iterator<DataTableFeatureKey> it = FEATURE.iterator(); it.hasNext();) { 
       DataTableFeature feature = table.getFeature(it.next()); 

       if(feature.shouldEncode(context, table)) { 
        feature.encode(context, this, table); 
       } 
      } 
     } 
     else { 
      preRender(context, table); 

      encodeMarkup(context, table); 
      encodeScript(context, table); 
     } 
    } 
} 
zu verlängern versuchen Des Weiteren

, fügen Sie machen Klasse Gesichter-config

<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
     <render-kit> 
      <renderer> 
       <component-family>org.primefaces.component</component-family> 
       <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type> 
       <renderer-class>com.edtoktay.CustomDataTableRenderer</renderer-class> 
      </renderer> 
     </render-kit> 
</faces-config> 

this helps

+0

Und für welche PF-Version ist das? 5.1? – Kukeltje

+0

Und ** warum ** sollte das so gemacht werden? – Kukeltje

+0

Die Version, die ich verwendet wurde, ist PF 5.1 auch. Durch die Verwendung dieser erweiterten Klassen und das Überschreiben der Ladefunktion von LazyDataModel können Sie alle Attribute der Datentabelle und des Datenmodells bearbeiten und bearbeiten.Ich habe die obigen Klassen nicht nur zum Sortieren verwendet, sondern auch, um andere Attribute von Dataset programmgesteuert zu ändern – edt