h: Вложенная сортировка dataTable - PullRequest
0 голосов
/ 17 октября 2018

У меня проблема с сортировкой в ​​JSF h:dataTable.

Мне нужно структурировать таблицу, в которой начальный общий критерий сортировки - это число в первом столбце.

Если имеется несколько записей с одинаковым счетом, то эти записи должны быть отсортированы в функции второго столбца с именами, которые должны отображаться в алфавитном порядке.

Если снова должно быть несколько записей с одинаковыми значениямив первом и втором столбце эти записи должны быть отсортированы в функции третьего столбца, который является именем местоположения, которое должно быть перечислено снова в алфавитном порядке.

Если снова должно быть несколько записей сте же значения в первом, втором и третьем столбце, затем эти записи должны быть отсортированы в функции четвертого столбца, который является возрастным числом, которое должно появляться в порядке возрастания.

Я знаю, что могуполучить начальное значение сортировки с помощью атрибута "sortBy" и sortingOrder = ascending.Но я борюсь с другими ранее упомянутыми требованиями сортировки, вот где я ищу помощь ... Есть ли способ сделать это без использования пользовательских функций сортировки?

Вот xhtml-код таблицы данных.

            <h:dataTable value = "#{userData.employees}" 
              var = "employee"
              styleClass = "employeeTable"
              headerClass = "employeeTableHeader"
              rowClasses = "employeeTableOddRow,employeeTableEvenRow"
              sortBy=“#{employee.score}“ sortOrder=“ascending“>
             <h:column>
              <f:facet id = "header">score</f:facet>
                #{employee.score}
             </h:column>

             <h:column>                 
              <f:facet name = "header">Name</f:facet>                   
               #{employee.name}
             </h:column>

             <h:column>
              <f:facet name = "header">Location</f:facet>
              #{employee.location }
             </h:column>

             <h:column>
              <f:facet name = "header">Age</f:facet>
              #{employee.age}
             </h:column>
           </h:dataTable>

1 Ответ

0 голосов
/ 18 октября 2018

TL; DR: Вы можете сделать это, фактически используя простую таблицу DataTable с sortMode="multiple" и sortBy="#{userData.employeeSortingMeta}", возвращая список org.primefaces.model.SortMeta экземпляров.

Прежде всего вам придется преобразовать вашобычный HTML JSF dataTable для Primefaces Datatable, добавление атрибутов ID в dataTable и столбцы, а также добавление атрибутов sortBy к каждому столбцу:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
           ...
            xmlns:p="http://primefaces.org/ui">

<h:form id="frmEmployees">
<p:dataTable id="tblEmployees" value = "#{userData.employees}" 
  var = "employee"
  styleClass = "employeeTable"
  headerClass = "employeeTableHeader"
  rowClasses = "employeeTableOddRow,employeeTableEvenRow"
  sortBy=“#{userData.employeeSortingMeta}“ sortMode=“multiple“>
 <p:column id="score" sortBy="#{employee.score}">
  <f:facet id = "header">score</f:facet>
    #{employee.score}
 </p:column>

 <p:column id="name" sortBy="#{employee.name}">                 
  <f:facet name = "header">Name</f:facet>                   
   #{employee.name}
 </p:column>

 <p:column id="location" sortBy="#{employee.location}">
  <f:facet name = "header">Location</f:facet>
  #{employee.location }
 </p:column>

 <p:column id="age" sortBy="#{employee.age}">
  <f:facet name = "header">Age</f:facet>
  #{employee.age}
 </p:column>
</p:dataTable>

В вашем компоненте создайте методы для построения метаданных сортировки:

private List<SortMeta> employeeSortingMeta;

public List<SortMeta> getEmployeeSortingMeta() {
    return this.employeeSortingMeta;
}

@PostConstruct
public void initialize() {
    employeeSortingMeta = new ArrayList<>(4);
    employeeSortingMeta.add(createSortMeta("score", SortOrder.DESCENDING));
    employeeSortingMeta.add(createSortMeta("name", SortOrder.ASCENDING));
    employeeSortingMeta.add(createSortMeta("location", SortOrder.ASCENDING));
    employeeSortingMeta.add(createSortMeta("age", SortOrder.ASCENDING));
}

private SortMeta createSortMeta(final String sortProperty, final SortOrder order) {
    // find the sort column component
    final UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
    final String columnIdPrefix = "frmEmployees:tblEmployees:";
    final UIColumn column = (UIColumn) viewRoot.findComponent(columnIdPrefix + sortProperty);
    assert null != column : "wtf?";

    // create sort meta
    final SortMeta sortMeta = new SortMeta();
    sortMeta.setSortBy(column);
    sortMeta.setSortField(sortProperty);
    sortMeta.setSortOrder(order);
    return sortMeta;
}

Так и должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...